197

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

4

6 回答 6

219

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 不能假设您将所有未来的插入限制为单字节字符。

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)
于 2008-12-02T01:55:28.930 回答
81

TLDR;MySql 没有等效的概念varchar(max),这是 MS SQL Server 的一个特性。

什么是 VARCHAR(最大值)?

varchar(max)是 Microsoft SQL Server 的一项功能。

在 2005 版之前的 Microsoft SQL Server 版本中,列可以存储的数据量限制为 8KB。为了存储超过 8KB 的数据,您必须使用TEXTNTEXTBLOB列类型,这些列类型将它们的数据存储为与表数据页分开的 8K 页的集合;他们支持每行最多存储 2GB。

对这些列类型的最大警告是,它们通常需要特殊的函数和语句来访问和修改数据(例如READTEXTWRITETEXTUPDATETEXT

在 SQL Server 2005 中,varchar(max)引入了统一用于检索和修改大列中数据的数据和查询。列的数据varchar(max)与表数据页内联存储。

当 MAX 列中的数据填满 8KB 数据页时,会分配一个溢出页,前一页指向它,形成一个链表。与TEXT,NTEXT和不同BLOBvarchar(max)列类型支持所有与其他列类型相同的查询语义。

所以varchar(MAX)真的意味着varchar(AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING)而不是varchar(MAX_SIZE_OF_A_COLUMN)

MySql 没有等效的成语。

为了获得与varchar(max)MySql 中相同的存储量,您仍然需要使用BLOB列类型。本文讨论了一种在MySql中高效存储大量数据的非常有效的方法。

于 2008-12-02T02:49:34.780 回答
32

varchar 的最大长度是

65535

除以该列设置为的字符集中字符的最大字节长度(例如,utf8=3 字节,ucs2=2,latin1=1)。

减去 2 个字节来存储长度

减去所有其他列的长度

每 8 个可为空的列减去 1 个字节。如果您的列为空/非空,则将其存储为一个字节/字节中的一位,称为空掩码,每列一位可以为空。

于 2008-12-02T03:42:42.677 回答
5

对于 Sql 服务器

更改表 prg_ar_report_colors 添加 Text_Color_Code VARCHAR(max);

对于 MySQL

更改表 prg_ar_report_colors 添加 Text_Color_Code 长文本;

对于甲骨文

更改表 prg_ar_report_colors 添加 Text_Color_Code CLOB;

于 2016-12-02T11:18:13.177 回答
1

Mysql 在限制大小时将列从 VARCHAR 转换为 TEXT !!!

mysql> CREATE TABLE varchars1(ch3 varchar(6),ch1 varchar(3),ch varchar(4000000))
;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+-------+------+---------------------------------------------+
| Level | Code | Message                                     |
+-------+------+---------------------------------------------+
| Note  | 1246 | Converting column 'ch' from VARCHAR to TEXT |
+-------+------+---------------------------------------------+
1 row in set (0.00 sec)

mysql>
于 2015-06-11T08:32:56.613 回答
-14

MySQL 5.6.12 中 varchar 的最大长度为 4294967295。

于 2014-06-18T15:23:21.827 回答