相当于MySQL中的varchar(max)?

问题描述 投票:0回答:5

MySQL 中的 varchar(max) 相当于什么?

mysql varchar
5个回答
235
投票

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)



88
投票

MySQL 没有

varchar(max)

的等效概念,这是 MS SQL Server 的功能。


什么是 VARCHAR(max)?

varchar(max)

是 Microsoft SQL Server 的一项功能。

在 2005 版之前的 Microsoft SQL Server 版本中,列可以存储的数据量限制为 8KB。为了存储超过 8KB,您必须使用 

TEXT

NTEXT
BLOB
列类型,这些列类型将其数据存储为与表数据页分开的 8K 页的集合;他们支持每行存储高达 2GB。
这些列类型的一个重要警告是它们通常需要特殊的函数和语句来访问和修改数据(例如

READTEXT

WRITETEXT
UPDATETEXT
在 SQL Server 2005 中,引入了 

varchar(max)

来统一用于检索和修改大列中的数据的数据和查询。

varchar(max)
列的数据与表数据页内联存储。
当 MAX 列中的数据填满 8KB 数据页时,会分配一个溢出页,并且前一页指向它,形成一个链表。与 

TEXT

NTEXT
BLOB
不同,
varchar(max)
列类型支持与其他列类型相同的查询语义。
所以

varchar(MAX)

真正的意思是

varchar(AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING)
而不是
varchar(MAX_SIZE_OF_A_COLUMN)
MySQL 没有等效的习惯用法。

为了获得与 MySQL 中的

varchar(max)

相同的存储量,您仍然需要诉诸

BLOB
列类型。
本文
讨论了一种在 MySQL 中高效存储大量数据的非常有效的方法。


32
投票

65535

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

减去2个字节来存储长度

减去所有其他列的长度

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


9
投票

更改表 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;


3
投票

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>

© www.soinside.com 2019 - 2024. All rights reserved.