MySQL中的数据类型详解

基本数据类型:

MySQL 提供了多种数据类型,主要包括数值型、字符串类型、日期和时间类型。不同的 MySQL版本支持的数据类型可能会稍有不同,用户可以通过查询相应版本的帮助文件来获得具体信息。 MySQL 支持所有标准 SQL 中的数值类型,其中包括严格数值类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION),并在此基础上做了扩展。扩展后增加了 TINYINT、MEDIUMINT 和 BIGINT 这 3 种长度不同的整型,并增加了 BIT 类型,用来存放位数据。大致如下图所示:

MySQL中的数据类型详解

对于整型数据,MySQL 还支持在类型名称后面的小括号内指定显示宽度,例如 int(5)表
示当数值宽度小于 5 位的时候在数字前面填满宽度,如果不显示指定宽度则默认为 int(11)。
一般配合 zerofill 使用,顾名思义,zerofill 就是用“0”填充的意思,也就是在数字位数不够
的空间用字符“0”填满。而且是当输入的值大于了宽度的限制的时候,会将数据截断到限定的值长度。

另外,整数类型还有一个属性:AUTO_INCREMENT。在需要产生唯一标识符或顺序值时,
可利用此属性,这个属性只用于整数类型。AUTO_INCREMENT 值一般从 1 开始,每行增加 1。
在插入 NULL 到一个 AUTO_INCREMENT 列时,MySQL 插入一个比该列中当前最大值大 1 的
值。一个表中最多只能有一个AUTO_INCREMENT列。在mysql中有三种方式去定义主键的增长,

CREATE TABLE AI(ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY);
CREATE TABLE AI(ID INT AUTO_INCREMENT NOT NULL ,PRIMARY KEY(ID));
CREATE TABLE AI (ID INT AUTO_INCREMENT NOT NULL ,UNIQUE(ID));

对于小数的表示,MySQL 分为两种方式:浮点数和定点数。浮点数包括 float(单精度)
和 double(双精度),而定点数则只有 decimal 一种表示。定点数在 MySQL 内部以字符串形
式存放,比浮点数更精确,适合用来表示货币等精度高的数据。;例如 float(7,4)的一个列可以显示为-999.9999,表示一共有7位数字,然后小数点后面要有4位数,当插入的师资位数大于限定的值的时候会进四舍五入的方式进行数据的保存。

 float(7,4)的一个列可以显示为-999.9999

日期类型:

MySQL 中有多种数据类型可以用于日期和时间的表示,

MySQL中的数据类型详解

这些数据类型的主要区别如下:
1.如果要用来表示年月日,通常用 DATE 来表示。

2.如果要用来表示年月日时分秒,通常用 DATETIME 表示。
3.如果只用来表示时分秒,通常用 TIME 来表示。
4.如果需要经常插入或者更新日期为当前系统时间,则通常使用 TIMESTAMP 来表示。
TIMESTAMP 值返回后显示为“YYYY-MM-DD HH:MM:SS”格式的字符串,显示宽度固定
为 19 个字符。如果想要获得数字值,应在 TIMESTAMP 列添加+0。
 5.如果只是表示年份,可以用 YEAR 来表示,它比 DATE 占用更少的空间。YEAR 有 2 位或
4 位格式的年。默认是 4 位格式。在 4 位格式中,允许的值是 1901~2155 和 0000。在
2 位格式中,允许的值是 70~69,表示从 1970~2069 年。MySQL 以 YYYY 格式显示 YEAR
值。
如果存储的值超过了数据类型的范围之后系统会进行错误提示,并将以零值来进行存储。

以datetime来演示插入数据。

  YYYY-MM-DD HH:MM:SS 或 YY-MM-DD HH:MM:SS 格式的字符串。允许“不严格”语法:任何标点符都可以用做日期部分或时间部分之间的间割符。例如,“98-12-31 11:30:45”、“98.12.31 11+30+45”、“98/12/31 11*30*45”和“[email protected]@31 11^30^45”是等价的。对于包括日期部分间割符的字符串值,如果日和月的值小于 10,不需要指定两位数。“1979-6-9”与“1979-06-09”是相同的。同样,对于包括时间部分间割符的字符串值,如果时、分和秒的值小于 10,不需要指定两位数。“1979-10 30 1:2:3”与“1979-10-30 01:02:03”相同。
  YYYYMMDDHHMMSS 或 YYMMDDHHMMSS 格式的没有间割符的字符串,假定字符串对于日期类型是有意义的。例如,“19970523091528”和“970523091528”被解释为“1997-05-23 09:15:28”,但“971122129015”是不合法的(它有一个没有意义的分钟部分),将变为“0000-00-00 00:00:00”。
  YYYYMMDDHHMMSS 或 YYMMDDHHMMSS 格式的数字,假定数字对于日期类型是
有意义的。例如,19830905132800和830905132800被解释为“1983-09-05 13:28:00”。
数字值应为 6、8、12 或者 14 位长。如果一个数值是 8 或 14 位长,则假定为YYYYMMDD 或 YYYYMMDDHHMMSS 格式,前 4 位数表示年。如果数字 是 6 或 12位长,则假定为 YYMMDD 或 YYMMDDHHMMSS 格式,前 2 位数表示年。其他数字被解释为仿佛用零填充到了最近的长度。
  函数返回的结果,其值适合 DATETIME、DATE 或者 TIMESTAMP 上下文,例如 NOW()
或 CURRENT_DATE。

字符串类型:

MySQL 包括了 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和 SET 等多种。

CHAR 列的长度固定为创建表时声明的长度,长度可以为从 0~255 的任何值;
而 VARCHAR 列中的值为可变长字符串,长度可以指定为 0~255 (5.0.3以前)或者 65535 (5.0.3
以后)之间的值。在检索的时候,CHAR 列删除了尾部的空格,而 VARCHAR 则保留这些空格。

enum类型,它的值范围需要在创建表时通过枚举方式显式指定,对 1~255 个成员的枚举需要 1 个字节存储;对于 255~65535 个成员,需要 2 个字节存储。最多允许有 65535 个成员。

set类型,Set 和 ENUM 类型非常类似,也是一个字符串对象,里面可以包含 0~64 个成员。根据
成员的不同,存储上也有所不同。Set 和 ENUM 除了存储之外,最主要的区别在于 Set 类型一次可以选取多个成员,而 ENUM则只能选一个,

例如。Create table t(col set('a','b','c','d'));insert into t values('a,b'),('a'),('a,d,a'),('a,d,f');则在set的范围里面的值 可以插入,但是f值没有存在则此条是不能被插入的,还有就是要是set集合中要是存在相同的值,则选择一个进行存储。