文本字符串类型
字符串类型用来存储字符串数据,除了可以在存储字符串数据之外,还可以存储其他数据,比如图片和声音的二进制数据。(MySQL还支持两类字符型数据:文本字符串类型。文本字符串二进制字符串)
表一
类型名称 | 说明 | 存储需求 |
---|---|---|
CHAR(M) | 固定长度非二进制字符串 | M字节,1<=M<=255 |
VARCHAR(M) | 变长非二进制字符串 | L+1字节,在此L<=M和1<=M<=255 |
TINYTEXT | 非常小的非进制字符串 | L+1字节,在此L<28 |
TEXT | 小的非二进制字符串 | L+2字节,在此L<216 |
MEDIUMTEXT | 中等大小的非二进制字符串 | L+3字节,在此L<232 |
ENUM | 枚举类型,只能一个枚举字符串值 | 1或2字节,取值于枚举值的数目(最大值为65535) |
SET | 一个设置,字符串对象可以有零个或多个SET成员 | 1,2,3,4或8字节,取值于集合成员的数量(最多为64个成员) |
上面的L是实际长度
VARCHAR和TEXT类型都是边长类型,其存储需求取决于列值的实际长度(前面的表格中用L表示),而不是取决于类型的最大可能尺寸。例如,一个VARCHAR(10)列能保存最大长度为10个字符的字符串,实际的存储需要是字符串的长度L加上1字节(记录字符串的长度)。对于字符"abcd",L是4而存储要求是5字节。
CHAR和VARCHAR类型
-
CHAR(M)为固定长度字符串,在定义时指定字符串列长。当保存时在右侧填充空格,以达到指定的长度。M表示列长度,M的范围时0~255个字符。例如
,CHAR(4)定义了一个固定长度的字符串列,其包含的字符个数最大为4。当检索到CHAR值时,尾部的空格将被删除。 -
VARCHAR(M)是长度可变的字符串,M表示最大列长度。M的范围是0-65535。VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定,而实际占用的空间为字符串的实际长度加1。例如,VARCHAR(M)是长度可变的字符串,M表示最大列长度。M的范围是0-65535。VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定,而实际占用的空间为字符串的实际长度加1。例如,VARCHAR(50)定义了一个最大长度为50的字符串,如果插入的字符串只有10个字符,则实际存储的字符串为10个字符和一个字符串结束字符。VARCHAR在值保存和检索时尾部的空格仍保留。
下面用不同字符串保存到CHAR(4)与VARCHAR(4)存储区别
表二
插入值 | CHAR(4) | 存储需求 | VARCHAR(4) | 存储需要 |
---|---|---|---|---|
‘’ | ‘\s\s\s\s’ | 4字节 | ‘’ | 1字节 |
‘ab’ | ‘ab\s\s’ | 4字节 | ‘ab’ | 3字节 |
‘abc’ | ‘abc\s’ | 4字节 | ‘abc’ | 4字节 |
‘abcd’ | ‘abcd’ | 4字节 | ‘abcd’ | 4字节 |
‘abcdf’ | ‘abcd’ | 4字节 | abcd | 4字节 |
从上表可以看出,不管插入的长度为多少,占用的空间均为4个字节;VARCHAR定义的列所占字节数均为实际长度+1。
CHAR和VARCHAR取出时的区别
表二中最后一行的值只有在使用"不严格"模式时,字符串才会被截断插入;如果MYSQL运行在’严格’,超过列长度的值不会被保存,并且会出现错误信息 “ERROR 1406(22001)”:Data too long for column",
设置严格模式 set session 只在当前操作界面有效 set global 全局有效,全局设置。 set session sql_mode =‘STRICT_TRANS_TABLES’ 修改完之后退出当前客户端重新登陆即可。
TEXT类型
TEXT列保存非二进制字符串,如文章内容,评论等。当保存或查询TEXT列的值时,不删除尾部空格。
TEXT类型分为4种:TINYTEXT,TEXT,MEDIUMTEXT和LONGTEXT。不同的TEXT类型存储空间和数据长度不同。
- TINYTEXT最大长度为255(28 -1)字符的TEXT列。
- TEXT最大长度为65535(216 -1)字符的TEXT列。
- MEDIUMTEXT最大长度为16777215(224 -1)字符的TEXT列。
- MEDIUMTEXT最大长度为16777215(224 -1)字符的TEXT列。
- LONGTEXT最大长度为4294967295(232 -1)或4GB字符的TEXT列。
ENUM类型
ENUM是一个字符串对象,其值为表创建时在列规定中枚举的一列值。语法格式如下:
字段名 ENUM('值1','值2',......'值n')
先创建一张测试表
再插入数据
然后取出数据
定义改ENUM类型的列(‘ZHANGSAN’,‘LISI’,‘WANGWU’),改列可以取的值和每个值的索引如表三所示
表三
值 | 索引 |
---|---|
NULL | NULL |
‘’ | 0 |
ZHANGSAN | 1 |
LISI | 2 |
WANGWU | 3 |
ENUM值依照索引顺序排列,并且空字符串排在非空字符串前,NULL值排在其他所有的枚举值前。
ENUM类型的字段在取值时,只能在指定的枚举列表中取,而且一次只能取一个。创建的成员中有空格时,其尾部的空格将自动被删除。ENUM值在内部用整数表示,并且每个枚举值均有一个索引值:列表值所允许的成员值从1开始编号,MYSQL存储的就是这个索引编号。枚举最多可以有65535个元素。
ENUM列总有一个默认值:如果将ENUM列声明为NULL,NULL值则为该列的一个有效值,并且默认为NULL;如果ENUM列被声明为NOTNULL,其默认值为允许的值列表的第一个元素。
SET
SET是一个字符串对象,可以有零或多个值。SET列最多可以有64个成员,其值为表创建时规定的一列值。指定包括多个SET成员的SET列值时,各成员之间用逗号(,)间隔开。语法格式如下:
SET ('值1','值2'......'值n')
与ENUM类型相同,SET值在内部用整数表示,列表中每一个值都有一个索引编号。当创建表时,SET成员值的尾部空格将自动被删除。与ENUM类型不同的是,ENUM类型的字段只能从定义的列值中选择一个值插入,而SET类型的列可从定义的列值中选择多个字符的联合。
如果插入SET字段列值有重复,则MYSQL自动删除重复的值;插入SET字段的值的顺序不重要,MYSQL会存入数据库时按照定义的顺序显示;如果插入了不正确的值,默认情况下,MYSQL将忽视这些值,并给出警告。