1.数值类型
MYSQL支持所有标准SQL,这其中包括:
- 精确数值数据类型:INTERGER/INT,SMALLINT,DECIMAL/DEC,NUMERIC
- 近似数值数据类型:FLOAT,REAL,DOCULE PRECISION
- BIT数据类型
作为对标准SQL的扩展,MySQL还支持TINYINT,MEDIUMINT及BIGINT,如下图:
2.日期时间类型
当使用DATE与TIME类型时通常需要注意的事项:
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的值可以非常的长,所以在使用时会有一些限制:
3.4 ENUM类型
ENUM是从被
一个具有固定值的列表中选取一项作为值的字符串对象.
枚举的值必须用引号包围,不能为表达式,或者一个变量估值.如果想用数值作为枚举值,那也必须得用引号引起. 枚举的值在以下情况下可以为''或NULL:
函数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'),与之相对应的数值表为:
如果赋予此列的值为9,在二进制上为1001,所以'a'和'd'被选中,即其结果值为'a,d'.
对于一个包含多个SET元素的值,不管其插入值的顺序如何,也不否重复与否,当检索结果时,每个元素只会出现在次,且按照被定义的顺序.