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
但如果我们尝试减少长度,我们会发现最大的长度是可行的:
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)
TLDR;MySql没有等效的varchar(max)概念,这是mssql 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中高效存储大量数据的有效方法。
varchar的最大长度是
65535
除以该列设置的字符集中字符的最大字节长度(例如utf8=3字节,ucs2=2, latin1=1)。
减去2字节来存储长度
减去所有其他列的长度
每8个可空列减去1个字节。如果你的列为空或非空,这将被存储为一个字节/字节称为空掩码,每列1位是空的。
Mysql转换列从VARCHAR到文本时,限制大小!!
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>
Sql Server
修改表prg_ar_report_colors添加Text_Color_Code VARCHAR(max);
MySql
alter table prg_ar_report_colors添加Text_Color_Code longtext
对甲骨文
alter table prg_ar_report_colors添加Text_Color_Code CLOB;
推荐文章
- 如果字段在MySQL中为空,则返回0
- 在MySQL中检测值是否为number
- MySQL中两个日期之间的差异
- 为什么在MySQL中文本列不能有一个默认值?
- 使用SQL查询查找最近的纬度/经度
- 在SQL Server上使用varchar(MAX) vs TEXT
- 如何停止mysqld
- 检查MySQL表是否存在而不使用“select from”语法?
- 从NOW() -1天选择记录
- 我看到VARCHAR(255)如此频繁地使用(而不是其他长度),有什么好的原因吗?
- 更改varchar列的大小为较低的长度
- 从表中选择1是什么意思?
- 数据库性能调优有哪些资源?
- 如何更改表的默认排序规则?
- MySQL foreign_key_checks是否影响整个数据库?