MySQL中char、varchar、text 简单总结

官网相关内容链接


[NATIONAL] CHAR[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]

  一个固定长度的字符串,在存储时始终用空格填充指定长度。M表示以字符为单位的列长度。范围M为0到255,如果M省略,则长度为1。

  CHAR除非PAD_CHAR_TO_FULL_LENGTH 启用S​​QL模式,否则在检索值 时将删除尾随空格 。

  CHAR是CHARACTER的简写。NATIONAL CHAR(或其等效的简写形式,NCHAR)是定义CHAR列应使用某些预定义字符集的标准SQL方法。MySQL使用utf8作为此预定义字符集

  CHAR BYTE数据类型是用于一个别名BINARY的数据类型。这是兼容性功能。

  MySQL允许您创建CHAR(0)类型的列。当您必须符合依赖于列的存在但实际上不使用其值的旧应用程序时,这非常有用。当你需要一个只能带两个值的列时,CHAR(0)也很好:一个定义为CHAR(0)的列只占用一位,只能取值NULL和”(空字符串)。

解释:PAD_CHAR_TO_FULL_LENGTH

  默认情况下,CHAR在检索时从列值修剪尾随空格。如果 PAD_CHAR_TO_FULL_LENGTH启用,则不会进行修剪,并且检索的 CHAR值将填充到其全长。此模式不适 VARCHAR用于在检索时保留尾随空格的列。
  从MySQL 8.0.13开始, PAD_CHAR_TO_FULL_LENGTH 不推荐使用。它将在未来的MySQL版本中删除。

mysql> CREATE TABLE t1 (c1 CHAR(10));
Query OK, 0 rows affected (0.37 sec)

mysql> INSERT INTO t1 (c1) VALUES('xy');
Query OK, 1 row affected (0.01 sec)

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
+------+-----------------+
| c1   | CHAR_LENGTH(c1) |
+------+-----------------+
| xy   |               2 |
+------+-----------------+
1 row in set (0.00 sec)

mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
+------------+-----------------+
| c1         | CHAR_LENGTH(c1) |
+------------+-----------------+
| xy         |              10 |
+------------+-----------------+
1 row in set (0.00 sec)

[NATIONAL] VARCHAR(M) [CHARACTER SET charset_name] [COLLATE collation_name]

  可变长度的字符串。M 表示字符的最大列长度。范围M是0到65,535。VARCHAR的有效最大长度取决于最大行大小(65,535字节,在所有列之间共享)和使用的字符集。
  
  如果varchar字段定义中带有default null允许列空,则需要需要1bit来标识,每8个bits的标识组成一个字段,一张表中存在N个varchar字段,那么需要(N+7)/8 (取整)bytes存储所有的NULL标识位

  MySQL将VARCHAR值存储为1字节或2字节长度前缀加数据。长度前缀表示值中的字节数。 如果值不超过255个字节,则VARCHAR列使用一个长度字节;如果值可能需要超过255个字节,则使用两个长度字节。
  
  
解释:所有列之间共享:
  例:选用utf8字符集,最大字节数的65535,减去NULL标识位,减去长度前缀位数,最后除以 3 ,就是当前表所共享的最大长度。

drop table if exists  test;create table test(name varchar(21843) )engine=innodb DEFAULT CHARSET=utf8;  
[SQL] create table test(name varchar(21843) )engine=innodb DEFAULT CHARSET=utf8;
受影响的行: 0
时间: 0.540ms

drop table if exists  test;create table test(name varchar(21842),age varchar(2) )engine=innodb DEFAULT CHARSET=utf8;  
[SQL] create table test(name varchar(21842),age varchar(2) )engine=innodb DEFAULT CHARSET=utf8;
[Err] 1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs


drop table if exists  test;create table test(name varchar(21842),age varchar(1) )engine=innodb DEFAULT CHARSET=utf8;  
[SQL] create table test(name varchar(21842),age varchar(1) )engine=innodb DEFAULT CHARSET=utf8;
受影响的行: 0
时间: 0.531ms

解释:最大长度受限于所选字符集

例如,utf8字符每个字符最多可能需要三个字节,因此VARCHAR使用该utf8字符集的 列 可以声明为最多21,844个字符。( (65535-2-1)/3=21844  2-长度大于256需要2个字节存储长度,1-一个字节长度存储NULL标识位,3-utf8模式下一个字符占三个字节)
例如,gbk字符每个字符最多可能需要两个字节,因此VARCHAR使用该gbk字符集的 列 可以声明为最多32,766个字符。( (65535-2-1)/2=32766  2-长度大于256需要2个字节存储长度,1-一个字节长度存储NULL标识位,3-utf8模式下一个字符占两个字节)

MySQL的遵从标准SQL规范,并没有从删除尾随空格 VARCHAR的值。

VARCHAR是简写 CHARACTER VARYING。 NATIONAL VARCHAR是标准SQL方法,用于定义 VARCHAR列应使用某些预定义字符集。MySQL使用 utf8此预定义字符集。NVARCHAR是简写 NATIONAL VARCHAR。

5.0版本以上,varchar(50),指的是50字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放50个。


TEXT[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]
一个TEXT列,最大长度为65,535(2 ^ 16 - 1)个字符。 如果值包含多字节字符,则有效最大长度会减少。 每个TEXT值使用2字节长度前缀存储,该前缀指示值中的字节数。

可以为此类型提供可选长度M. 如果这样做,MySQL会将列创建为最小的TEXT类型,其大小足以容纳M个字符长的值。

1)text和varchar基本相同

2)text会忽略指定的大小这和varchar有所不同,text不能有默认值

3)尾部有空格不会被截断

4)text使用额外的2个字节来存储数据的大小,varchar根据存储数据的大小选择用几个字节来存储

5)text的65535字节全部用来存储数据,varchar则会占用1-3个字节去存储数据大小


  • 经常变化的字段用varchar
  • 知道固定长度的用char
  • 超过255字符的只能用varchar或者text
  • 能用varchar的地方不用text

效率来说基本是char>varchar>text,但是如果使用的是Innodb引擎的话,推荐使用varchar代替

你可能感兴趣的:(mysql)