MySQL中的varchar(max)的类似功能是什么?

推荐答案

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

但如果我们try 减少长度,我们会发现最长的长度是有效的:

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

现在,如果我们try 在表级别使用多字节字符集,我们会发现它将每个字符计为多个字节.UTF8字符串不会在每个字符串中使用多个字节,但MySQL不能假设您将来会将所有插入限制为单字节字符.

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相关问答推荐

SQL按另一个表中的字段进入顺序对子查询进行排序

mysql使用LIKE查找二进制字段有问题

插入时发生日期时间字段溢出错误

布尔值之间的 SQL less/greater 比较会产生意外结果

在MySQL查询中查找和替换表内的值

实体内约束的唯一增量 ID 生成

如何计算具有权重属性的记录数

for each 查询设置 MySQL @@session.time_zone 而不是 CONVERT_TZ 的缺点?

java.lang.NullPointerException:无法调用com.proj.my.repository.OrderRepository.save(Object),因为this.orderRepository为空

如何使用减号运算符编写 sql 查询以返回缺少相应值的行?

JOOQ:如何将 POJO 列序列化为 JSON

更新和替换未加引号的 JSON 字符串

If else on WHERE 子句

MySQL函数查找两个日期之间的工作日数

是否可以在 macOS 上只安装 mysqldump

如何用一系列日期填充表格?

MySQL 实用程序 - ~/.my.cnf 选项文件

MySQL:ALTER IGNORE TABLE 给出违反完整性约束

PHP mySQL - 将新记录插入表中,主键自动递增

从 MySQL JSON 数据类型中提取不带引号的值