MySQL的数据类型和建库策略分析详解

更新时间:2008年04月06日 01:16:47   作者:

无论是在小得可怜的免费数据库空间或是大型电子商务网站,合理的设计表结构、充分利用空间是十分必要的。这就要求我们对数据库系统的常用数据类型有充分的认识。下面我就将我的一点心得写出来跟大家分享。

一、数字类型。数字类型按照我的分类方法分为三类:整数类、小数类和数字类。

我所谓的“数字类”,就是指DECIMAL和NUMERIC,它们是同一种类型。它严格的说不是一种数字类型,因为他们实际上是将数字以字符串形式保存的;他的值的每一位(包括小数点)占一个字节的存储空间,因此这种类型耗费空间比较大。但是它的一个突出的优点是小数的位数固定,在运算中不会“失真”,所以比较适合用于“价格”、“金额”这样对精度要求不高但准确度要求非常高的字段。

小数类,即浮点数类型,根据精度的不同,有FLOAT(单精度)和DOUBLE(双精度)两种。它们的优势是精确度,FLOAT可以表示绝对值非常小、小到约 1.17E-38 (0.000...0117, 小数点后面有37个零)的小数,而DOUBLE更是可以表示绝对值小到约 2.22E-308 (0.000...0222, 小数点后面有307个零)的小数。FLOAT类型和DOUBLE类型占用存储空间分别是4字节和8字节。如果需要用到小数的字段,精度要求不高的,当然用FLOAT了!可是说句实在话,我们“民用”的数据,哪有要求精度那么高的呢?这两种类型至今我没有用过——我还没有遇到适合于使用它们的事例。

用的最多的,最值得精打细算的,是整数类型。从只占一个字节存储空间的TINYINT到占8个字节的BIGINT,挑选一个“够用”并且占用存储空间最小的类型是设计数据库时应该考虑的。TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT占用存储空间分别为1字节、2字节、3字节、4字节和8字节,就无符号的整数而言,这些类型能表示的最大整数分别为255、65535、16777215、4294967295和18446744073709551615。如果用来保存用户的年龄(举例来说,数据库中保存年龄是不可取的),用TINYINT就够了;九城的《纵横》里,各项技能值,用SMALLINT也够了;如果要用作一个肯定不会超过16000000行的表的AUTO_INCREMENT的IDENTIFY字段,当然用 MEDIUMINT 不用 INT ,试想,每行节约一个字节,16000000行可以节约10兆多呢!

二、日期时间类型。

日期和时间类型比较简单,无非是 DATE、TIME、DATETIME、TIMESTAMP和YEAR等几个类型。只对日期敏感,而对时间没有要求的字段,就用DATE而不用DATETIME是不用说的了;单独使用时间的情况也时有发生——使用TIME;但最多用到的还是用DATETIME。在日期时间类型上没有什么文章可做,这里就不再详述。

三、字符(串)类型。

不要以为字符类型就是 CHAR !CHAR和VARCHAR的区别在于CHAR是固定长度,只要你定义一个字段是CHAR(10),那么不论你存储的数据是否达到了10个字节,它都要占去10个字节的空间;而VARVHAR则是可变长度的,如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的,VARCHAR 类型的实际长度是它的值的(实际长度+1)。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度呀!从这个“+1”中也应该看到,如果一个字段,它的可能值最长是10个字符,而多数情况下也就是用到了10个字符时,用VARCHAR就不合算了:因为在多数情况下,实际占用空间是11个字节,比用CHAR(10)还多占用一个字节!

举个例子,就是一个存储股票名称和代码的表,股票名称绝大部分是四个字的,即8个字节;股票代码,上海的是六位数字,深圳的是四位数字。这些都是固定长度的,股票名称当然要用 CHAR(8) ;股票代码虽然是不固定长度,但如果使用VARVHAR(6),一个深圳的股票代码实际占用空间是5个字节,而一个上海的股票代码要占用7个字节!考虑到上海的股票数目比深圳的多,那么用VARCHAR(6)就不如CHAR(6)合算了。

虽然一个CHAR或VARVHAR的最大长度可以到255,我认为大于20的CHAR是几乎用不到的——很少有大于20个字节长度的固定长度的东东吧?不是固定长度的就用VARCHAR!大于100的VARCHAR也是几乎用不到的——比这更大的用TEXT就好了。TINYTEXT,最大长度为255,占用空间也是(实际长度+1);TEXT,最大长度65535,占用空间是(实际长度+2);MEDIUMTEXT,最大长度16777215,占用空间是(实际长度+3);LONGTEXT,最大长度4294967295,占用空间是(实际长度+4)。为什么“+1”?“+2”?“+3”?“+4”?你要是还不知道就该打PP了。这些可以用在论坛啊、新闻啊,什么的,用来保存文章的正文。根据实际情况的不同,选择从小到大的不同类型。

四、枚举和集合类型。

枚举(ENUM)类型,最多可以定义65535种不同的字符串从中做出选择,只能并且必须选择其中一种,占用存储空间是一个或两个字节,由枚举值的数目决定;集合(SET)类型,最多可以有64个成员,可以选择其中的零个到不限定的多个,占用存储空间是一个到八个字节,由集合可能的成员数目决定。

举个例子来说,在SQLServer中,你可以节约到用一个Bit类型来表示性别(男/女),但MySQL没有Bit,用TINTINT?不,可以用ENUM('帅哥','美眉')!只有两种选择,所以只需一个字节——跟TINYINT一样大,但却可以直接用字符串'帅哥'和'美眉'来存取。真是太方便啦!

好了,MySQL的数据类型介绍得差不多,我的建库策略也随着介绍数据类型介绍给大家一些。但这只是其中一部分,篇幅有限,不能再细说;其他的,就靠各人在对数据类型理解的基础上,多多实践、多多讨论。

相关文章

这篇文章主要为大家详细介绍了mysql 8.0 Windows zip包版本安装详细过程,以及密码认证插件修改,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-05-05

这篇文章主要介绍了mysql 字段as详解,并附实例代码的相关资料,需要的朋友可以参考下2016-09-09

这篇文章主要介绍了Winserver2012下mysql 5.7解压版(zip)配置安装教程详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下2017-01-01

前些日子在开发一个舆情监测系统,需要在一个操作过程中往数据表里插入大量的数据,为了改变以往生硬地逐条数据插入的笨办法,也为了提高执行效率,决定用load data infile来执行数据插入。2009-05-05

这篇文章主要介绍了mysql默认编码为UTF-8 通过修改my.ini实现方法的相关资料,为了防止出现乱码,Latin1是不支持汉字的,所以要将其改为UTF-8或GBK,需要的朋友可以参考下2017-01-01

这篇文章主要为大家详细介绍了Mac下MySQL安装配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-05-05

有时候我们需要计算每半小时的平均值,那么就需要参考下面的sql语句了2015-11-11

在本篇文章里小编给大家分享了关于Mysql中mysql.user用户表的相关知识点内容,有需要的朋友们可以参考下。2019-09-09

这篇文章主要介绍了MySQL5.7.20解压版安装和修改root密码的教程,非常不错,具有参考借鉴价值,需要的朋友可以参考下2018-04-04

在使用mysql增加新用户之后,发现新增的用户无法登陆,一时束手无策,网上搜集整理了一下,晒出来和大家分享一下,希望可以帮助你们2012-11-11

最新评论

mysql数据类型设计说明_MySQL的数据类型和建库策略分析详解相关推荐

  1. mysql 自动截断_MySql中关于超长自动截断的案例详解

    这篇文章主要介绍了MySql超长自动截断实例详解的相关资料,这里通过实例来说明如何实现自动截断的功能,需要的朋友可以参考下 MySql超长自动截断实例详解 小伙伴问到一个问题,为啥在项目中调用插入或者 ...

  2. mysql installer安装_MySQL Installer 8.0.21安装教程图文详解

    1. 缘由 刚好需要在新系统上重新安装MySQL,便写了一份的下载安装教程,供查阅,以防日后细节有所遗忘. 2. 版本说明 MySQL Installer 8.0.21 3. 下载安装包 方式一:官网 ...

  3. mysql select语法_MySQL SELECT语法(一)SELECT语法详解

    SELECT的语法如下: SELECT[ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT ...

  4. 未知mysql主机怎么办_Mysql如何巧妙的绕过未知字段名详解

    前言 本文介绍的是DDCTF第五题,绕过未知字段名的技巧,这里拿本机来操作了下,思路很棒也很清晰,分享给大家,下面来看看详细的介绍: 实现思路 题目过滤空格和逗号,空格使用%0a,%0b,%0c,%0 ...

  5. mysql 查询 集合_MySQL使用集合函数进行查询操作实例详解

    本文实例讲述了MySQL使用集合函数进行查询操作.分享给大家供大家参考,具体如下: COUNT函数 SELECT COUNT(*) AS cust_num from customers; SELECT ...

  6. mysql引号注入_MySQL在不知道列名情况下的注入详解

    前言 最近感觉脑子空空,全在为了刷洞去挖洞,还是回归技术的本身让自己舒服些.好了,下面话不多说了,来一起看看详细的介绍吧 前提 以下情况适用于 MySQL < 5版本,或者在 MySQL > ...

  7. linux mysql 数据类型_MySQL的数据类型和建库策略(转)

    MySQL的数据类型和建库策略: 无论是在小得可怜的免费数据库空间或是大型电子商务网站,合理的设计表结构.充分利用空间是十分必要的.这就要求我们对数据库系统的常用数据类型有充分的认识.下面我就将我的一 ...

  8. python标准类型内建模块_Python内建模块struct实例详解

    本文研究的主要是Python内建模块struct的相关内容,具体如下. Python中变量的类型只有列表.元祖.字典.集合等高级抽象类型,并没有像c中定义了位.字节.整型等底层初级类型.因为Pytho ...

  9. MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解

    MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解 Percona XtraDB Cluster简称PXC.Percona Xtradb Cluster的实现是在 ...

最新文章

  1. 滴滴CEO程维:当初把产品拿给美团王兴看,他说了两个字“垃圾”!
  2. 写代码做副业月入33K+的方法都藏在这几个淘宝大佬的公众号里!
  3. python的pyqt5_Pycharm+Python+PyQt5使用详解
  4. 涅槃重生的下一个超级风口:8本书助你赢在未来
  5. 【编撰】linux IPC 002 - 匿名管道PIPE和有名管道FIFO的概念和实例,以及应用比较
  6. 本地像服务器传文件,本地向服务器传送文件
  7. 屏幕小于6英寸的手机_这3款手机屏幕小于6英寸,单手操控没压力
  8. 一片新的ATmega328芯片如何烧录?
  9. 计算机无法安装64位操作系统,彻底根除“无法安装64位版本的Office,因为在您的PC上找到了以下32位程序:”的问题-网络教程与技术 -亦是美网络...
  10. stm32f103读取红外接收HS0038A2
  11. cad转excel插件c2e_CAD表格互转EXCEL插件
  12. Leetcode腾讯50题精选题解|旋转图像
  13. Vue3的生命周期的使用
  14. 无线连接服务器678,上网显示,“错误678,远程服务器~”是什么意思,怎么处理?...
  15. 毕设-基于SpringBoot房屋租赁系统
  16. IMX6ULL的GPIO驱动源码分析
  17. layui树形表格(treetable)列数据合计
  18. 微服务配合docker使用
  19. 闲鱼python_python生成最小树
  20. 犯罪现场调查第一季/全集CSI迅雷下载

热门文章

  1. Windows10 安装、升级失败,错误 0x800701b1 - 0x2000A
  2. 国产游戏的曙光?聊聊“太吾绘卷”背后的游戏江湖
  3. 国产降噪耳机哪款降噪效果好?降噪效果好的降噪耳机推荐
  4. linux进程tsm是什么,Linux 下安装和配置TSM 7.1
  5. 青龙面板使用BIlibiliTool完成每日任务+天选时刻抽奖+大会员大积分等
  6. 淘宝入会页全新升级详细内容介绍{淘宝打单发货接口}
  7. 毛诗新译(四)国风.豳风.狼跋_拔剑-浆糊的传说_新浪博客
  8. linux如何禁用核显黑屏,我的双显卡禁用了,用的核显intel,风扇也正常转动,为啥电脑...
  9. reactnative安卓真机调试
  10. Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xm