11.3.2 CHAR 和 VARCHAR 类型

官方文档地址:11.3.2 The CHAR and VARCHAR Types


CHARVARCHAR类型很相似,但是它们的存储和检索方式不同。它们在最大长度和是否保留尾随空格方面也存在差异。

CHARVARCHAR类型声明的长度表示希望存储的最大字符数。例如,CHAR(30)最多可以容纳30个字符。

CHAR列的长度固定为创建表时声明的长度。长度范围为0 ~ 255。当存储CHAR值时,它们将被空格右填充到指定的长度。当检索CHAR值时,末尾的空格将被删除,除非启用了PAD_CHAR_TO_FULL_LENGTH SQL 模式。

VARCHAR列中的值是变长字符串。长度可以指定为0 ~ 65,535的值。VARCHAR的有效最大长度取决于最大的行大小(65,535字节,在一行中的所有列之间共享)和所使用的字符集。参见 8.4.7 对表列数和行大小的限制

CHAR不同,VARCHAR值在存储的时候会在数据前面加上1字节或2字节长度的前缀,长度前缀表示值中的字节数。如果值需要不超过255个字节,则使用一个长度字节,如果值需要超过255个字节,则使用两个长度字节。

如果没有启用严格 SQL 模式,并且将超过列最大长度的值分配给CHARVARCHAR列,该值会被截断以适合列的最大长度,并生成警告。要禁止非空格字符的截断,可以使用严格的 SQL 模式导致出现错误(而不是警告)并禁止插入值。参见 5.1.11 服务器 SQL 模式

对于VARCHAR列,超过列长度的尾随空格在插入之前被截断,并生成警告,无论使用的是哪种 SQL 模式。对于CHAR列,无论使用哪种 SQL 模式,都静默地截断插入值的多余尾随空格。

VARCHAR值在存储时不会被填充。在存储和检索值时保留尾随空格,这符合标准 SQL。

下表通过显示将各种字符串值存储到CHAR(4)VARCHAR(4)列(假设该列使用一个单字节字符集,如latin1)的结果,说明了CHARVARCHAR之间的区别。
在这里插入图片描述
仅当没有使用严格的 SQL 模式时,表最后一行显示的值才适用;如果启用了严格模式,则不会存储超过列长度的值,并且会导致错误。

InnoDB将长度大于等于768字节的定长字段编码为可变长字段,可以在页外存储。例如,如果字符集的最大字节长度大于3,比如utf8mb4CHAR(255)列可以存储超过768字节。

如果给定的值存储在CHAR(4)VARCHAR(4)列中,则从列中检索到的值并不总是相同的,因为检索时CHAR列删除了尾随空格。下面的例子说明了这一区别:

mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO vc VALUES ('ab  ', 'ab  ');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM vc;
+---------------------+---------------------+
| CONCAT('(', v, ')') | CONCAT('(', c, ')') |
+---------------------+---------------------+
| (ab  )              | (ab)                |
+---------------------+---------------------+
1 row in set (0.06 sec)

将根据分配给该列的字符集排序规则对CHARVARCHARTEXT列中的值进行排序和比较。

MySQL 排序规则的 pad 属性是PAD SPACE,而基于UCA 9.0.0及更高版本的 Unicode 排序规则的 pad 属性是NO PAD。(参见 10.10.1 Unicode 字符集)。

要确定排序规则的 pad 属性,请使用INFORMATION_SCHEMA下的COLLATIONS表,该表有一个PAD_ATTRIBUTE列。

对于非二进制字符串(CHARVARCHARTEXT值),字符串排序规则的 pad 属性决定比较字符串末尾的空格时的处理方法。NO PAD排序法像对待任何其他字符一样对待末尾的空格。PAD SPACE排序法在比较时将尾随空格视为不重要的,字符串的比较不考虑末尾的空格。对于尾随空格,服务器 SQL 模式对比较行为没有影响。

注意

关于 MySQL 字符集和排序的更多信息,参见 第10章 字符集,排序规则,Unicode。有关存储需求的其他信息,参见 11.7 数据类型存储要求

对于那些删除了尾随字符或比较忽略它们的情况,如果列具有唯一值的索引,则向列中插入仅在尾随字符数量上不同的值将导致重复键错误。例如,如果一个表包含'a',尝试存储'a '会导致重复键错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值