MySQL 数据类型

VictorLi 发布于 2010/12/03 16:53
阅读 3K+
收藏 6

 

1.数值类型

MYSQL支持所有标准SQL,这其中包括:

  • 精确数值数据类型:INTERGER/INT,SMALLINT,DECIMAL/DEC,NUMERIC
  • 近似数值数据类型:FLOAT,REAL,DOCULE PRECISION
  • BIT数据类型

作为对标准SQL的扩展,MySQL还支持TINYINT,MEDIUMINT及BIGINT,如下图:

Type Bytes Minimum Value Maximum Value
    (Signed/Unsigned) (Signed/Unsigned)
TINYINT 1 -128 127
    0 255
SMALLINT 2 -32768 32767
    0 65535
MEDIUMINT 3 -8388608 8388607
    0 16777215
INT 4 -2147483648 2147483647
    0 4294967295
BIGINT 8 -9223372036854775808 9223372036854775807
    0

18446744073709551615

  • 如果ZEROFILL指定给数值列,则MYSQL会自动添加UNSIGNED属性
  • 整数或浮点类型均可指定AUTO_INCREMENT属性,当被赋值NULL或0时会自动设置成下一个序列值,AUTO_INCREMENT序列从1开始
  • MYSQL将DOUBLE与DOUBLE PRECISION等同,将REAL也与DOUBLE PRECISION等同
  • DECIMAL与NUMERIC用来存储精确数值数据,NUMERIC是DECIMAL的一种实现,MYSQL5.5将DECIMAL与NUMERIC存储为二进制格式
  • BIT数据类型用来存储比特数值,BIT(M)中M允许从1到64,位数不足时会自动左侧补0
  • SERIAL 等同于BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
2.日期时间类型
     当使用DATE与TIME类型时通常需要注意的事项:
  •  MYSQL会尝试从各种格式的输入中解析日期与时间,但还是有格式限制的
  • 只有两位数的YEAR,会让MYSQL感到迷惑,所以MYSQL会尝试作下面的解析:在70~99之间的年会被解析成:1970~1999,在00~69之间的年会被解析成2000~2069
  • MYSQL在解析日期时,日期的输入顺序必须为:year-month-day,否则无法正确解析
  • 默认情况下,MYSQL会将超出范围或不合法的日期与时间,转换成0,但对于超出范围的TIME,会将其归整到一个恰当的时间点上。下面是“0”格式的格式,前提是没有设置NO_ZERO_DATE,否则会抛出警告: p, li { white-space: pre-wrap; }

    Data Type

    “Zero” Value

    DATETIME

    '0000-00-00 00:00:00'

    DATE

    '0000-00-00'

    TIMESTAMP

    '0000-00-00 00:00:00'

    TIME

    '00:00:00'

    YEAR

    0000

  • DATEIME,DATE与TIMESTAMP的区别在于所表示的日期时间范围不同:DATETIME是 p, li { white-space: pre-wrap; } :'1000-01-01 00:00:00' to '9999-12-31 23:59:59',DATE是:‘1000-01-01’到‘9999-12-31’,而TIMESTAMP是:‘1970-01-01 00:00:01’UTC到‘2038-01-19 03:14:07’UTC(随MYSQL的版本不同而改变)
  • MYSQL识别日期时间时遵循相对“松散”的格式,即不关心日期日间之间的分隔符是什么,有或没有,只要日期正确,都可以识别,如:‘10-12-04 21:50:59’,‘10.12.04 21+50+59’,‘10/12/04 21*50^59’,‘101204215059’,都是一样的,都可以被正确识别出来。
  • TIMESTAMP 类型会自动初始化及更新. TIMESTAMP默认值为CURRENT_TIMESTAMP,除非其被指定了其它默认值,参考如下:
    自动初始化与更新 ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    自动初始化 ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    自动更新 ts TIMESTAMP DEFAULT 0 NO UPDATE CURRENT_TIMESTAMP
    ts TIMESTAMP DEFAULT 0

3.字符串类型
    字符串类型包括:CHAR,VARCHAR,BINARY,VARBINARY,BLOB,TEXT,ENUM和SET.
     3.1 CHAR与 VARCHAR类型
      这两种类型很相似,但它们的存储与检索方法不同,最大长度也不同以及是否保留尾部空格也不同.CHAR与VARCHAR中的数字是来表明它们最多可以存储的字符数的,如CHAR(90),能存储90个字符. CHAR的长度是固定的,可以从0-255,当被存储时会通过右侧补空格的方式来填满整个长度.当检索取出时,如果设置了SQL模式为:PAD_CHAR_TO_FULL_LENGTH,会自动去掉后面的空格.
      VARCHAR存储的是变长字符串,长度范围在0-65535之间,但其实际的最大值受限于行的最大值(所有列共享65535个字节),与CHAR相反,VARCHAR为附加1或2个字节的在其数据前面,用以指明实际存储的字符数,即如果字符串<=255,则附加1字节,否则2个字节.
     MYSQL的所有归类(collations)都是PADSPACE的,所以无论是CHAR还是VARCHAR在比较时都会自动去除尾部的空格再进行比较.
    3.2 BINARY与VARBINAY
     它们与CHAR及VARCHAR类似,不同之处在于BINARY与VARBINARY使用字节为存储单位,而CHAR与VARCHAR使用字符为存储单位.BINARY可以用作CHAR及VARHCAR的一个属性,但它们的意义确不同.CHAR(5) BINARY === CHAR(5) CHARACTER SET latin1 COLLATE latin1_bin(假设默认字符集是latin1),而BINARY(5)就表示存储5字节的二进制数据,没有字符集,也没有归类.
      BINARY存储之后会用0x00来补全未填充的字节,在选出时,尾部字节也不会被丢弃.所有的字节在比较中都会被用到,其中包括ORDER BY 和 DISTINCT操作,0x00与space(空格)是不同的,0x00<space.但如果具有BINARY属性的列被指定为索引且唯一值时,那么自动填加的补充字节就无效了,否则会抛出duplicate-key错误.所有在使用BINARY类型时,需要仔细考虑前面提到填充和剔除特性. 如果您希望得到的值与存储的值完全一样,没有填充字节的问题,那么可优先考虑VARBINARY或BLOB类型.
     3.3 BLOB与TEXT
      BLOB存储的是二进制这字符串,即字节字符串,没有字符集,排序和比较都是按字节的数值.TEXT存储的是非二进制字符串排序与比较依据的是其字符集所对应的归类(整理).因为BLOB与TEXT的值可以非常的长,所以在使用时会有一些限制:
  • 在排序时,只有max_sort_length个字节被使用,默认值是1024,如果想在不改变此变量的前提下,使更多的字节加入排序,可以彩用SUBSTRING()方法
  • 当查询结果中包含BLOB或TEXT实例列时,MYSQL是采用在磁盘上创建临时表的方式处理的,因为MEMORY引擎是不支持这两种类型的.因为磁盘的使用会导致性能下降,所以除非确实需要,否则在查询中不要包含TEXT或BLOB列,特别是不要使用如SELECT *,来查询所有列.
  • BLOB与TEXT的最大值决定于它们的类型,但是客户端与服务器之间的实际可传输的最大值却取决于空闲内存的数量及通信缓冲区的大小. 我们可能通过调整max_allowed_packet来增大缓冲,但需要在客户端与服务器端同时设置
      3.4 ENUM类型
      ENUM是从一个具有固定值的列表中选取一项作为值的字符串对象.被枚举的值必须用引号包围,不能为表达式,或者一个变量估值.如果想用数值作为枚举值,那也必须得用引号引起. 枚举的值在以下情况下可以为''或NULL:
  • 如果一个无效的值赋予了ENUM对象,那么一个空字符串会被插入,作为一个特殊的错误值,这个字符串与"正常"的空字符串有差别,其在数值上为0.
  • 如果ENUM列被声明允许为NULL,那么NULL就是一个合法的值,且默认值就是NULL,如果声明为NOT NULL,那么其默认值就是列表中的第一个元素.
  • 每个被枚举的值都有一个索引,索引从1开始,所以当枚举值无效时其值会被赋予0,NULL的索引是NULL,(这里所说的索引,专指相应元素在枚举列表中所处的位置.
     枚举值排序是按照它们在列表中的索引即位置进行排序的,空字符串会排在所有非空字符串之间,而NULL又会排在空字符串之前.如果希望枚举值按照字母表来排序的话,需要使用CAST(col as CHAR)或CONCAT(col)来实现.
      函数SUM()或AVG()在对枚举列进行计算时,都使用的是索引值.如果想查询某一枚举列的详细信息,可使用:
      mysql>show columns from table_name like enum_col
      3.5 SET类型
      SET是一个可以0或更多值的字符串对象,和ENUM类似,其值同样来自于一个用逗号分隔的列表,因此SET值成员本身不能包含逗号. 如SET('one','two') not null 的列可能有值为:'','one','two','one,two'.一个SET可以最多有64个不同成员值.检索SET值时,会按列定义时的大小写显示,并且SET列可以指定字符集和归类整理,所以当使用BINARY或区分大小的归类时,需要特别注意.
      MySQL通过数值的方式来存储SET值,存储值低序位对应第一组元素.如果在数值上下文中检索一个SET值,所获得的bits序列值,对了SET成员中能够组成这个序列的成员组合.举例说明,如有SET('a','b','c','d'),与之相对应的数值表为:
p, li { white-space: pre-wrap; }

SET Member

Decimal Value

Binary Value

'a'

1

0001

'b'

2

0010

'c'

4

0100

'd'

8

1000

如果赋予此列的值为9,在二进制上为1001,所以'a'和'd'被选中,即其结果值为'a,d'.
对于一个包含多个SET元素的值,不管其插入值的顺序如何,也不否重复与否,当检索结果时,每个元素只会出现在次,且按照被定义的顺序.
加载中
0
该用户已被和谐
该用户已被和谐

更新中....

为啥不一次按照MySql的文档更新了呢?

哈哈哈哈哈 ....

0
VictorLi
VictorLi

引用来自#2楼“该用户已被和谐”的帖子

更新中....

为啥不一次按照MySql的文档更新了呢?

哈哈哈哈哈 ....

呵呵,时间有限,慢慢来吧

0
ValueError
ValueError

表示很受不了MySQL没有Boolean

0
猫丶
猫丶

引用来自#4楼“TonySeek”的帖子

表示很受不了MySQL没有Boolean

换头像了。。。。好霸气

0
VictorLi
VictorLi

引用来自#4楼“TonySeek”的帖子

表示很受不了MySQL没有Boolean

也许MySQL公司认为用tinyint(1)更省空间且效率更高,所以就省略了boolean类型.

导致的结果就是开发者需要麻烦一点自行处理,呵呵!

0
bastetwang
bastetwang

用非零,0来判断true,false,比其他什么都来得方便。

0
bastetwang
bastetwang

C也没有bool类型。

0
ValueError
ValueError

引用来自#5楼“Lunatica”的帖子

引用来自#4楼“TonySeek”的帖子

表示很受不了MySQL没有Boolean

换头像了。。。。好霸气

这-_- |||

0
ValueError
ValueError

引用来自#8楼“bastetwang”的帖子

C也没有bool类型。

o(∩∩)o...哈哈,这种“非0就是true“在C觉得挺正常的,但是数据库还是习惯了有bool。

返回顶部
顶部