MysQL中,文本字符串总体上分为CHAR、VARCHAR、TINYTEXT 、TEXT 、MEDIUMTEXT 、LONGTEXT 、ENUM 、SET等类型。
image.png

char与varchar类型

CHAR和VARCHAR类型都可以存储比较短的字符串。
image.png

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;

  1. <a name="tUosL"></a>
  2. ## varchar类型
  3. - VARCHAR(M)定义时,**必须指定**长度M,否则报错。
  4. - MySQL4.0版本以下,varchar(20):指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节); MySQL5.0版本以上,varchar(20):指的是20字符。
  5. - 检索VARCHAR类型的字段数据时,会保留数据尾部的空格。VARCHAR类型的字段所占用的存储空间为字符串实际长度加1个字节。
  6. ```sql
  7. use dbtest12;
  8. # 未指定长度,报错!!!
  9. CREATE TABLE test_varchar1(
  10. NAME VARCHAR #错误
  11. );
  12. #Column length too big for column 'name' (max = 21845); use BLOB or TEXT instead
  13. CREATE TABLE test_varchar2(
  14. NAME VARCHAR(65535)
  15. );
  16. CREATE TABLE test_varchar3(
  17. NAME VARCHAR(5)
  18. );
  19. INSERT INTO test_varchar3
  20. VALUES('尚硅谷'),('尚硅谷教育');
  21. #Data too long for column 'NAME' at row 1
  22. INSERT INTO test_varchar3
  23. VALUES('尚硅谷IT教育');

image.png

  • 存储很短的信息。比如门牌号码101,201….这样很短的信息应该用char,因为varchar还要占个byte用于存储信息长度,本来打算节约存储的,结果得不偿失。
  • 固定长度的。比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占个长度信息。
  • 十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。

TEXT类型

在MysQL中,TEXT用来保存文本类型的字符串,总共包含4种类型,分别为TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT类型。
在向TEXT类型的字段保存和查询数据时,系统自动按照实际长度存储,不需要预先定义长度。这一点和VARCHAR类型相同。
每种TEXT类型保存的数据长度和所占用的存储空间不同,如下:
image.png由于实际存储的长度不确定,MySQL不允许TEXT类型的字段做主键。遇到这种情况,你只能采用CHAR(M),或者VARCHAR(M)。

  1. use dbtest12;
  2. CREATE TABLE test_text(
  3. tx TEXT
  4. );
  5. INSERT INTO test_text
  6. VALUES('atguigu ');
  7. SELECT CHAR_LENGTH(tx)
  8. FROM test_text; #10

TEXT文本类型,可以存比较大的文本段,搜索速度稍慢,因此如果不是特别大的内容,建议使用CHAR,VARCHAR来代替。还有TEXT类型不用加默认值,加了也没用。而且text和blob类型的数据删除后容易导致“空洞”,使得文件碎片比较多,所以频繁使用的表不建议包含TEXT类型字段,建议单独分出去,单独用一个表。