当前位置:  开发笔记 > 后端 > 正文

MySQL中varchar(max)的等价物?

如何解决《MySQL中varchar(max)的等价物?》经验,为你挑选了3个好方法。

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



1> Bill Karwin..:

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)


我还建议使用TEXT
@DanW,`TEXT`长度限制为64K.`MEDIUMTEXT`长度限制是16M.`LONGTEXT`长度限制为4G.
这个问题的最大问题是,如果您创建一个该大小的列,那么您的表中只能包含**一列**.MySql中的*MAX*行大小是64k,所以如果你有64k列,那就是你得到的.这个相同的约束不适用于Sql Server的`varchar(max)`列类型.
@AdnanShammout:当然,除非你想为列声明一个`DEFAULT`值.使用TEXT或BLOB类型无法做到这一点.

2> joshperry..:

什么是VARCHAR(最大)?

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

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

大告诫这些列类型是,他们通常需要特殊的职能和声明,访问和修改的数据(例如READTEXT,WRITETEXTUPDATETEXT)

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

当MAX列中的数据填充8KB数据页时,将分配溢出页,并且前一页指向它形成链表.与TEXT,NTEXTBLOB,varchar(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中存储大量数据.


@njk是的,但是为了解释MySql中的"等价物"(或者在这种情况下缺少等价物),必须准确描述`varchar(max)`**真正**意味着什么.
很好的答案!+1

3> ʞɔıu..:

varchar的最大长度是

65535

除以字符集中字符集的最大字节长度(例如,utf8 = 3字节,ucs2 = 2,latin1 = 1).

减去2个字节来存储长度

减去所有其他列的长度

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

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有