MySQL基础篇:数据类型


常见的数据类型有:

  • 整型(xxxint)
  • 位类型(bit)
  • 浮点数(float和double、real)
  • 定点数(decimal、numeric)
  • 日期时间类型(date、time、datetime、year)
  • 字符串(char、varchar、xxxtext)
  • 二进制数据(xxxBlob、xxbinary)
  • 枚举(enum)
  • 集合(set)

1、整型(xxxint)

整型类型字节范围(有符号)范围(无符号)用途
TINYINT1(-128,127)(0,255)小整数值
SMALLINT2(-32768,32767)(0,65535 )大整数值
MEDIUMINT3(-8388608,8388607)(0,1677215)大整数值
INT、INTEGER4(-2147483648,2147483647)(0,4294967295 )大整数值
BIGINT8(-9223372036854775808,9223372036854775807)(0,18446744073709551615)极大整数值

整型列的可选属性有三个:

  • M:宽度(在 0 填充的时候才有意义,否则不需要指定)
  • unsigned:无符号类型(非负)
  • zerofill:0 填充,(如果某列是 zerofill,那么默认就是无符号),如果指定了 zerofill 只是表示不够 M 位时,用 0 在左边填充,如果超过 M 位,只要不超过数据存储范围即可

原来,在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系。 int(3)、int(4)、int(8) 在磁盘上都是占用4 个字节的存储空间

2、浮点型

对于浮点列类型,在 MySQL 中单精度值使用 4 个字节,双精度值使用 8 个字节。

  • MySQL 允许使用非标准语法(其他数据库未必支持,因此如果设计到数据迁移,则最好不要这么用):FLOAT(M,D)或 DOUBLE(M,D)。这里,(M,D)表示该值一共显示 M 位,其中 D 表示小数点后几位,M 和 D 又称为精度和标度。例如,定义为 FLOAT(5,2)的一个列可以显示为-999.99-999.99。M 取值范围为 0~255。D 取值范围为 0~30,同时必须<=M。
  • 如果存储时,整数部分超出了范围(如上面的例子中,添加数值为 1000.01),MySql 就会报错,不允许存这样的值。如果存储时,小数点部分若超出范围,就分以下情况:若四舍五入后,整数部分没有超出范围,则只警告,但能成功操作并四舍五入删除多余的小数位后保存,例如在FLOAT(5,2)列内插入999.009,近似结果是999.01。若四舍五入后,整数部分超出范围,则 MySql 报错,并拒绝处理。如 999.995 和-999.995 都会报错。
  • 说明:小数类型,也可以加 unsigned,但是不会改变数据范围,例如:float(3,2) unsigned 仍然只能表示 0-9.99的范围。
  • float 和 double 在不指定精度时,默认会按照实际的精度(由实际的硬件和操作系统决定)来显示
  • REAL 就是 DOUBLE ,如果 SQL 服务器模式包括 REAL_AS_FLOAT 选项,REAL 是 FLOAT 的同义词而不是 DOUBLE的同义词。
类型字节范围(有符号)范围(无符号)用途
FLOAT4(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度
浮点数值
DOUBLE8(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度
浮点数值
DECIMAL对于DECIMAL(M,D),
如果M>D,为M+2,否则为D+2
依赖于M和D的值依赖于M和D的值小数值

注意:在编程中,如果用到浮点数,要特别注意误差问题,因为浮点数是不准确的,所以我们要避免使用“=”来判断两个数是否相等。如果希望保证值比较准确,推荐使用定点数数据类型。

3、位类型

  • BIT 数据类型可用来保存位字段值。BIT(M)类型允许存储 M 位值。M 范围为 1~64,默认为 1。
  • BIT 其实就是存入二进制的值,类似 010110。如果存入一个 BIT 类型的值,位数少于 M 值,则左补 0。如果存入一个 BIT 类型的值,位数多于 M 值,MySQL 的操作取决于此时有效的 SQL 模式:如果模式未设置,MySQL 将值裁剪到范围的相应端点,并保存裁减好的值。如果模式设置为 traditional(“严格模式”),超出范围的值将被拒绝并提示错误,并且根据 SQL 标准插入会失败。
  • 对于位字段,直接使用 SELECT 命令将不会看到结果,可以用 bin()或 hex()函数进行读取。

4、定点型

  • DECIMAL 在 MySQL 内部以字符串形式存放,比浮点数更精确。定点类型占 M+2 个字节
  • DECIMAL(M,D)与浮点型一样处理规则。M 的取值范围为 0~65,D 的取值范围为 0~30,而且必须<=M,超出范围会报错
  • DECIMAL 如果指定精度时,默认的整数位是 10,默认的小数位为 0
  • NUMERIC 等价于 DECIMAL

5、字符串型

类型说明典型声明方式范围
char定长字符串gender char(1)char(M)
0<=M<=255
varchar变长字符串email varchar(20)varchar(M)
0<=M<=65535
(大约2W~6W个字符,受字符集的影响)
text文本串content text大约2W~6W个字符,受字符集的影响

char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。


char、varchar、text的区别

  • char是一种固定长度的类型,varchar则是一种可变长度的类型,他们的区别是:
  • char如果不指定(M)则表示长度默认是1个字符。varchar必须指定(M).
  • char(M)类型的数据列里,每个值都占用M个字符,如果某个长度小于M,MySQL就会在他的右边用空格字符补足(在检索操作中那些填补出来的空格字符将被去掉;如果存入时右边本身就带空格,检索时也会被去掉);在varchar(M)类型的数据列里,每个值只占用刚好够用的字符再加上一个到两个用来记录其长度的字节(即总长度为L字符+1/2个字节)
  • 由于某种原因 char 固定长度,所以在处理速度上要比 varchar 快速很多,但相对费存储空间,所以对存储不大,但在速度上有要求的可以使用 char 类型,反之可以用 varchar 类型来实例。
  • text 文本类型,可以存比较大的文本段,搜索速度稍慢,因此如果不是特别大的内容,建议使用 char,varchar来代替。还有 text 类型不用加默认值,加了也没用。

哪些情况使用char更好

  1. 存储很短的信息:比如门牌号码420,521……这样很短的信息应该用char,因为varchar还要占字节用于存储信息长度,本来打算节约存储的现在得不偿失;
  2. 固定长度的:比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占长度信息
  3. 十分频繁改变的column:因为varchar每次存储都有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。
  4. MyISAM和MEMORY存储引擎中无论使用char还是varchar其实都是作为char类型处理的。
  5. 建议使用varchar类型,特别是InnoDB存储引擎

6、枚举(ENUM)

MySql 中的 ENUM 是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值:

  • 可以插入空字符串""和 NULL(如果运行 NULL 的话)
  • 如果你将一个非法值插入 ENUM(也就是说,允许的值列之外的字符串),如果是严格模式,将不能插入,如果是非严格模式,将选用第一个元素代替,并警告
  • ENUM 最多可以有 65,535 个成员,需要 2 个字节存储
  • 当创建表时,ENUM 成员值的尾部空格将自动被删除

值的索引规则如下:

  • 来自列规定的允许的值列中的值从 1 开始编号
  • 空字符串错误值的索引值是 0
  • NULL 值的索引是 NULL

7、集合(SET)

SET 和 ENUM 类型非常类似,也是一个字符串对象,里面包含 0~64 个成员。

SET 和 ENUM 存储上有所不同,SET 是根据成员的个数决定存储的字节数。

SET 和 ENUM 最主要的区别在于 SET 类型一次可以选择多个成员,而 ENUM 则只能选择一个。

8、特殊的NULL类型

NULL类型的特征

  • 所有的类型的值都可以是null,包括int、float等数据类型
  • 空字符串"",不等于null,0也不等于null,false也不等于null
  • 任何运算符,判断符碰到NULL,都得NULL
  • NULL的判断只能用is null,is not null
  • NULL影响查询速度,一般避免使值为NULL

相关的面试题

1)为什么建表时,加not null default’’ / default 0

  • 不想让表中出现null值

2)为什么不想要的null的值

  • 不好比较,null是一种类型,比较时,只能用专门的is null 和is not null来比较。碰到运算符,一律返回null
  • 效率不高,影响提高索引的效果
  • 因此,在建表的时候,not null default ‘’/0
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值