mysql - 相当于 MySQL 中的 varchar(max)?

标签 mysql varchar

什么是 varchar(max) 在 MySQL 中的等价物?

最佳答案

varchar 的最大长度取决于 MySQL 中的最大行大小,即 64KB(不包括 BLOB):

VARCHAR(65535)

但是,请注意,如果您使用多字节字符集,则限制会更低:

VARCHAR(21844) CHARACTER SET utf8

这里有一些例子:

最大行大小为 65535,但 varchar 还包含一个或两个字节来编码给定字符串的长度。因此,您实际上不能声明最大行大小的 varchar,即使它是表中的唯一列。

mysql> CREATE TABLE foo ( v VARCHAR(65534) );
ERROR 1118 (42000): 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

但是,如果我们尝试减少长度,我们会找到最有效的长度:

mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)

现在,如果我们尝试在表级别使用多字节字符集,我们会发现它会将每个字符计为多个字节。 UTF8 字符串不一定每个字符串使用多个字节,但 MySQL 不能假设您将所有 future 的插入限制为单字节字符。

mysql> CREATE TABLE foo ( v VARCHAR(65532) ) CHARSET=utf8;
ERROR 1074 (42000): Column length too big for column 'v' (max = 21845); use BLOB or TEXT instead

尽管最后一个错误告诉我们,InnoDB 仍然不喜欢 21845 的长度。

mysql> CREATE TABLE foo ( v VARCHAR(21845) ) CHARSET=utf8;
ERROR 1118 (42000): 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

这是完全合理的,如果你计算出 21845*3 = 65535,这无论如何都行不通。而 21844*3 = 65532,确实有效。

mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)

关于mysql - 相当于 MySQL 中的 varchar(max)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/332798/

相关文章:

mysql从组中随机抽取N个

c# - 从 2 个表中获取行

mysql - 场景中如何使用INNER JOIN?

javascript - 有没有办法将当前日期与以 VARCHAR 格式存储在数据库中的日期进行比较?

mysql - 在 MySQL 中分割 Varchar 字符串

java - Appfog - Spring 应用程序 - 磁盘使用情况

mysql - 转换为 utf8mb4_unicode_ci 时出错

php - 在重复条目上增加 varchar 值

sql-server - 我的 VARCHAR(MAX) 字段的上限为 4000;是什么赋予了?

python - 检查python中的srt文件中是否存在原始数据的任何元素