MysQL中,文本字符串总体上分为CHAR、VARCHAR、TINYTEXT 、TEXT 、MEDIUMTEXT 、LONGTEXT 、ENUM 、SET等类型。
char与varchar类型
char类型
- CHAR(M)类型一般需要预先定义字符串长度。如果不指定(M),则表示长度默认是1个字符。
- 如果保存时,数据的实际长度比CHAR类型声明的长度小,则会在右侧填充空格以达到指定的长度。当MySQL检索CHAR类型的数据时,CHAR类型的字段会去除尾部的空格。
- 定义CHAR类型字段时,声明的字段长度即为CHAR类型字段所占的存储空间的字节数。 ```sql use dbtest12;
CREATE TABLE test_char1( c1 CHAR, c2 CHAR(5) );
DESC test_char1;
INSERT INTO test_char1(c1) VALUES(‘a’);
溢出,报错!!!
Data too long for column ‘c1’ at row 1
INSERT INTO test_char1(c1) VALUES(‘ab’);
INSERT INTO test_char1(c2) VALUES(‘ab’);
INSERT INTO test_char1(c2) VALUES(‘hello’);
INSERT INTO test_char1(c2) VALUES(‘尚’);
INSERT INTO test_char1(c2) VALUES(‘硅谷’);
INSERT INTO test_char1(c2) VALUES(‘尚硅谷教育’);
溢出,报错!!!
Data too long for column ‘c2’ at row 1
INSERT INTO test_char1(c2) VALUES(‘尚硅谷IT教育’);
SELECT * FROM test_char1;
INSERT INTO test_char1(c2) VALUES(‘ab ‘);
自动去除末尾空格
SELECT CHAR_LENGTH(c2) FROM test_char1;
<a name="tUosL"></a>
## varchar类型
- VARCHAR(M)定义时,**必须指定**长度M,否则报错。
- MySQL4.0版本以下,varchar(20):指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节); MySQL5.0版本以上,varchar(20):指的是20字符。
- 检索VARCHAR类型的字段数据时,会保留数据尾部的空格。VARCHAR类型的字段所占用的存储空间为字符串实际长度加1个字节。
```sql
use dbtest12;
# 未指定长度,报错!!!
CREATE TABLE test_varchar1(
NAME VARCHAR #错误
);
#Column length too big for column 'name' (max = 21845); use BLOB or TEXT instead
CREATE TABLE test_varchar2(
NAME VARCHAR(65535)
);
CREATE TABLE test_varchar3(
NAME VARCHAR(5)
);
INSERT INTO test_varchar3
VALUES('尚硅谷'),('尚硅谷教育');
#Data too long for column 'NAME' at row 1
INSERT INTO test_varchar3
VALUES('尚硅谷IT教育');
- 存储很短的信息。比如门牌号码101,201….这样很短的信息应该用char,因为varchar还要占个byte用于存储信息长度,本来打算节约存储的,结果得不偿失。
- 固定长度的。比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占个长度信息。
- 十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。
TEXT类型
在MysQL中,TEXT用来保存文本类型的字符串,总共包含4种类型,分别为TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT类型。
在向TEXT类型的字段保存和查询数据时,系统自动按照实际长度存储,不需要预先定义长度。这一点和VARCHAR类型相同。
每种TEXT类型保存的数据长度和所占用的存储空间不同,如下:
由于实际存储的长度不确定,MySQL不允许TEXT类型的字段做主键。遇到这种情况,你只能采用CHAR(M),或者VARCHAR(M)。
use dbtest12;
CREATE TABLE test_text(
tx TEXT
);
INSERT INTO test_text
VALUES('atguigu ');
SELECT CHAR_LENGTH(tx)
FROM test_text; #10
TEXT文本类型,可以存比较大的文本段,搜索速度稍慢,因此如果不是特别大的内容,建议使用CHAR,VARCHAR来代替。还有TEXT类型不用加默认值,加了也没用。而且text和blob类型的数据删除后容易导致“空洞”,使得文件碎片比较多,所以频繁使用的表不建议包含TEXT类型字段,建议单独分出去,单独用一个表。