数据类型

数值型

名称类型和描述存储空间(Byte)值范围(有符号)值范围(无符号)
TINYINT小整数值1-127 ~ 1270 ~ 255
SMALLINT大整数值2-32,768 ~ 32,7670 ~ 65,535
MEDIUMINT大整数值3-8,388,608 ~ 8,388,6070 ~ 16,777,215
INT大整数值4-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,295
INTEGER大整数值4-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,295
BIGINT极大整数值8-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,8070 ~ 18,446,744,073,709,551,615
FLOAT单精度浮点数值4IEEE754IEEE754
DOUBLE双精度浮点数值8IEEE754IEEE754
DECIMAL定点型16--

任何整数类型都可以加上 UNSIGNED 属性,表示数据是无符号的,即非负整数。

整数类型可以被指定长度,例如:INT(11) 表示长度为 11 的 INT 类型。 不过,长度在大多数场景是没有意义的,它不会限制值的合法范围,只会影响显示字符的个数。 而且需要和 UNSIGNED ZEROFILL 属性配合使用才有意义。 假定类型设定为 INT(5),属性为 UNSIGNED ZEROFILL,如果用户插入的数据为 12 的话,那么数据库实际存储数据为 00012。

DECIMAL 可以用于存储比 BIGINT 还大的整型,能存储精确的小数。 而 FLOAT 和 DOUBLE 是有取值范围的,并支持使用标准的浮点进行近似计算。 计算时 FLOAT 和 DOUBLE 相比 DECIMAL 效率更高一些。

日期和时间型

名称类型和描述存储空间(Byte)范围
DATE日期31000-01-01 ~ 9999-12-31
TIME时间或持续时间3-838:59:59 ~ 838:59:59
YEAR年份11901 ~ 2155
DATETIME混合日期时间81000-01-01 00:00:00 ~ 9999-12-31 23:59:59
TIMESTAMP混合日期时间41970-01-01 00:00:00 ~ 2038-01-19 03:14:07

尽量使用 TIMESTAMP,空间效率高于 DATETIME,用整数保存时间戳通常不方便处理。 如果需要存储微秒,可以使用 BIGINT 存储。

字符串类型

名称类型和描述存储空间(Byte)
CHAR定长字符串0 ~ 255
VARCHAR变长字符串0 ~ 65,535
TINYTEXT字符串0 ~ 255
TEXT字符串0 ~ 65,535
MEDIUMTEXT字符串0 ~ 16,777,215
LONGTEXT字符串0 ~ 4,294,967,295
TINYBLOB二进制字符串0 ~ 255
BLOB二进制字符串0 ~ 65,535
MEDIUMBLOB二进制字符串0 ~ 16,777,215
LONGBLOB二进制字符串0 ~ 4,294,967,295
  • VARCHAR 用于存储可变长字符串,它比定长类型更节省空间。
  • VARCHAR 使用额外 1 或 2 个字节存储字符串长度。列长度小于 255 字节时,使用 1 字节表示,否则使用 2 字节表示。
  • VARCHAR 存储的内容超出设置的长度时,内容会被截断。
  • CHAR 是定长的,根据定义的字符串长度分配足够的空间。
  • CHAR 会根据需要使用空格进行填充方便比较。
  • CHAR 适合存储很短的字符串,或者所有值都接近同一个长度。
  • CHAR 存储的内容超出设置的长度时,内容同样会被截断。

对于经常变更的数据来说,CHAR 比 VARCHAR 更好,因为 CHAR 不容易产生碎片。 对于非常短的列,CHAR 比 VARCHAR 在存储空间上更有效率。 使用时要注意只分配需要的空间,更长的列排序时会消耗更多内存。 尽量避免使用 TEXT、BLOB 类型,查询时会使用临时表,导致严重的性能开销。

枚举

create table my_enum(
    gender enum('男', '女', '保密')
);

有时可以使用 ENUM 代替常用的字符串类型。 枚举元素的顺序会按照元素出现的顺序,从 1 开始编号。

枚举在进行数据规范的时候,系统会自动建立一个数字与枚举元素的对应关系。 在进行数据插入时,系统自动将字符转换成对应的数字存储,然后再进行数据提取的时候,系统自动将数值转换成对应的字符串显示。 因为枚举实际存储的是数值,所以可以直接插入数值。

集合

集合跟枚举很类似,实际存储的是数值,而不是字符串,但集合是多选的。

create table my_set(
    hobby set('篮球', '足球', '乒乓球', '羽毛球', '排球', '台球', '网球', '棒球')
);

insert into my_set values('足球, 台球, 网球');

select hobby + 0, hobby from my_set;

插入数据可使用多个元素字符串组合,也可以直接插入数值。 集合中,每一个元素都是对应一个二进制位,被选中为 1,没有则为 0,最后反过来。

集合中元素的顺序没有关系,最终系统都会去匹配顺序。 集合的强大在于能够规范数据和节省空间。

powered by Gitbook该文件修订时间: 2020-04-10 10:05:54

results matching ""

    No results matching ""

    results matching ""

      No results matching ""