mysql支持的数据类型主要有:数值类型、时间/日期类型、字符串类型、枚举enum类型、集合set类型.

1.在数值类型中又包含整数类型,浮点数类型

整数类型有

UNPIVOT mysql 不支持 mysql不支持哪种数据类型_mysql


在整数类型中,可以采用unsigned来修饰,表示采用无符号的整数类型,不能出现负数。同时也增加可以存储的最大值,

当需要对一个字段存储一个超出许可范围的数字,MySQL 会根据允许范围最接近它的一端截短后再进行存储。还有一个比较特别的地方是,MySQL 会在不合规定的值插入表前自动修改为 0。

UNPIVOT mysql 不支持 mysql不支持哪种数据类型_mysql_02


可以查看到越界报错了,这个是在严格模式下的结果,在非严格模式下会看到警告和截断保存。

在使用时,还可以制定显示宽度,例如:int(5), tinyint(3)。当显示宽度小于指定的宽度是,则用空格代替;超过了还是显示完整值。ZEROFILL 修饰符规定 0(不是空格)可以用来真补输出的值。使用这个修饰符可以阻止 MySQL 数据库存储负值。

UNPIVOT mysql 不支持 mysql不支持哪种数据类型_mysql_03

浮点数类型有

UNPIVOT mysql 不支持 mysql不支持哪种数据类型_mysql_04


float为单精度类型,double为双精度类型,DECIMAL 数据类型用于精度要求非常高的计算中,这种类型允许指定数值的精度和计数方法作为选择参数。精度在这里指为这个值保存的有效数字的总个数,而计数方法表示小数点后数字的位数。比如语句 DECIMAL(7,3) 规定了存储的值不会超过 7 位数字,并且小数点后不超过 3 位。忽略 DECIMAL 数据类型的精度和计数方法修饰符将会使 MySQL 数据库把所有标识为这个数据类型的字段精度设置为 10,计算方法设置为 0。

也可以使用zerofill和unsigned以及指定显示宽度,指定显示宽度格式为:float(M,N), double(M,N), M>N。意思为显示不能超过M为数字,小数点后面最多有N为,如果小数点后面超过位数,则四舍五入。

下面测试一下float类型的zerofill和unsigned以及制定显示宽度的效果

UNPIVOT mysql 不支持 mysql不支持哪种数据类型_UNPIVOT mysql 不支持_05


可以看到当插入的数据整数部分宽度超过表时,则报错不让插入。小数部分超过时,则四舍五入插入。zerofill和unsigned仍保持在整数中的效果。

double类型以及decimal和float测试结果类似,

2. 日期/时间类型

UNPIVOT mysql 不支持 mysql不支持哪种数据类型_MySQL_06


具体的范围和不同的版本有差异,各位请参考即可。对于年份的插入来说,如果以两位插入,1到69之间默认为2001到2069,如果在70到99之间,默认为1970到1999,对于year类型、timestamp类型,date类型、datetime类型有效。对于分隔符,用户可以指定分号,减号,或者不指定都可以。

3. 字符串类型

UNPIVOT mysql 不支持 mysql不支持哪种数据类型_MySQL_07


CHAR 和 VARCHAR 类型

  CHAR 类型用于定长字符串,并且必须在圆括号内用一个大小修饰符来定义。这个大小修饰符的范围从 0-255。比指定长度大的值将被截短,而比指定长度小的值将会用空格作填补。

CHAR 类型可以使用 BINARY 修饰符。当用于比较运算时,这个修饰符使 CHAR 以二进制方式参于运算,而不是以传统的区分大小写的方式。

CHAR 类型的一个变体是 VARCHAR 类型。它是一种可变长度的字符串类型,并且也必须带有一个范围在 0-255 之间的指示器。CHAR 和 VARCHGAR 不同之处在于 MYSQL 数据库处理

这个指示器的方式:CHAR 把这个大小视为值的大小,不长度不足的情况下就用空格补足。而 VARCHAR 类型把它视为最大值并且只使用存储字符串实际需要的长度

(增加一个额外字节来存储字符串本身的长度)来存储值。所以短于指示器长度的 VARCHAR 类型不会被空格填补,但长于指示器的值仍然会被截短。严格模式下回直接报错。

因为 VARCHAR 类型可以根据实际内容动态改变存储值的长度,所以在不能确定字段需要多少字符时使用 VARCHAR 类型可以大大地节约磁盘空间、提高存储效率。

VARCHAR 类型在使用 BINARY 修饰符时与 CHAR 类型完全相同。

TEXT 和 BLOB 类型

  对于字段长度要求超过 255 个的情况下,MySQL 提供了 TEXT 和 BLOB 两种类型。根据存储数据的大小,它们都有不同的子类型。这些大型的数据用于存储文本块或图像、

声音文件等二进制数据类型。

TEXT 和 BLOB 类型在分类和比较上存在区别。BLOB 类型区分大小写,而 TEXT 不区分大小写。大小修饰符不用于各种 BLOB 和 TEXT 子类型。

比指定类型支持的最大范围大的值将被自动截短。

4. enum类型

enum 类型因为只允许在集合中取得一个值,有点类似于单选项。在处理相互排拆的数据时容易让人理解,比如人类的性别。ENUM 类型字段可以从集合中取得一个值或使用 null 值,除此之外的输入将会使 MySQL 在这个字段中插入一个空字符串。另外如果插入值的大小写与集合中值的大小写不匹配,MySQL 会自动使用插入值的大小写转换成与集合中大小写一致的值。

ENUM 类型在系统内部可以存储为数字,并且从 1 开始用数字做索引。一个 ENUM 类型最多可以包含 65536 个元素,其中一个元素被 MySQL 保留,用来存储错误信息,这个错误值用索引 0 或者一个空字符串表示。

MySQL 认为 ENUM 类型集合中出现的值是合法输入,除此之外其它任何输入都将失败。这说明通过搜索包含空字符串或对应数字索引为 0 的行就可以很容易地找到错误记录的位置。

5. 集合类型

SET 类型与 ENUM 类型相似但不相同。SET 类型可以从预定义的集合中取得任意数量的值。并且与 ENUM 类型相同的是任何试图在 SET 类型字段中插入非预定义的值都会使 MySQL 插入一个空字符串。如果插入一个即有合法的元素又有非法的元素的记录,MySQL 将会保留合法的元素,除去非法的元素。

 一个 SET 类型最多可以包含 64 项元素。在 SET 元素中值被存储为一个分离的“位”序列,这些“位”表示与它相对应的元素。“位”是创建有序元素集合的一种简单而有效的方式。

并且它还去除了重复的元素,所以 SET 类型中不可能包含两个相同的元素。

希望从 SET 类型字段中找出非法的记录只需查找包含空字符串或二进制值为 0 的行。

通过对每种数据类型的用途,物理存储,表示范围等有一个概要的了解。这样在面对具体应用时,就可以根据相应的特来来选择合适的数据类型,使得我们能够争取在满足应用的基础上,

用较小的存储代价换来较高的数据库性能。