为什么MySQL VARCHAR允许超过最大长度?
我用UTF-8为什么MySQL VARCHAR允许超过最大长度?,mysql,varchar,Mysql,Varchar,我用UTF-8VARCHAR(5000)创建了一个表,并用数据填充它。 但看起来该字段允许的数据比指示的要多: mysql> DESCRIBE test; +---------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+----------------
VARCHAR(5000)
创建了一个表,并用数据填充它。
但看起来该字段允许的数据比指示的要多:
mysql> DESCRIBE test;
+---------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| comment | varchar(5000) | YES | | NULL | |
+---------+------------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
mysql> SELECT MAX(LENGTH(comment)) FROM test;
+----------------------+
| MAX(LENGTH(comment)) |
+----------------------+
| 5001 |
+----------------------+
1 row in set (0.01 sec)
为什么会这样?5000从零开始,然后指望给你5001个字符。
它能做5002吗?VARCHAR的有效最大长度是65535字节。创建VARCHAR列时使用的数字5000实际上并不限制VARCHAR列允许存储的长度。与CHAR数据类型相比,这是一种不同的行为 好的,问题是返回的长度以字节为单位,而不是字符。因为字符串是UTF-8,所以我需要使用:
长度为5001,因为字符串正好包含一个双字节字符 不,不是那样的。我已经测试过了。您使用的是哪一个MySQL版本?至少在MySQL 5.6上不是:我又插入了6000个字符,它被截断为5000个。真正奇怪的是,这次不是5001@本杰明-有意思,我需要测试一下。根据MySQL参考指南,65535字节在表中的所有列之间共享,字符编码也存在问题。这两个问题中的任何一个会影响您的问题吗?好的,我知道了,因为列是UTF-8,我最多可以存储5000个UTF-8字符,而不是字节。这很正常。问题是,
LENGTH()。我想知道这是LENGTH()
中的一个bug,还是一个记录在案的行为!实际上,LENGTH()
以字节为单位返回长度,而CHAR\u LENGTH()
以字符为单位返回长度@Benjamin,我在我的5.6版本上做了一个小测试,得到了类似的结果:mysql>createtablett(c VARCHAR(5000));mysql>插入t值(重复('a',6000));错误1406(22001):第1行mysql>插入到t值中的列“c”的数据太长(重复('a',5000));查询OK,1行受影响(0.10秒)mysql>插入t值(重复('a',5001));错误1406(22001):第1行mysql>SET中的列“c”的数据太长@@SQL_MODE=“”;查询OK,受影响的0行(0.04秒)mysql>插入t值(重复('a',5001));查询正常,1行受影响,1条警告(0.08秒)
The following table illustrates the differences between CHAR and VARCHAR
by showing the result of storing various string values into CHAR(4) and
VARCHAR(4) columns (assuming that the column uses a single-byte character
set such as latin1).
Value |CHAR(4) |Storage Required |VARCHAR(4) |Storage Required
===================================================================================
'' ' ' 4 bytes '' 1 byte
'ab' 'ab ' 4 bytes 'ab' 3 bytes
'abcd' 'abcd' 4 bytes 'abcd' 5 bytes
'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes
===================================================================================
The values shown as stored in the last row of the table apply only when
not using strict mode; if MySQL is running in strict mode, values that exceed
the column length are not stored, and an error results.
mysql> DESCRIBE test;
+---------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| comment | varchar(5000) | YES | | NULL | |
+---------+------------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
mysql> SELECT MAX(LENGTH(comment)) FROM test;
+----------------------+
| MAX(LENGTH(comment)) |
+----------------------+
| 5001 |
+----------------------+
1 row in set (0.01 sec)
mysql> SELECT MAX(CHAR_LENGTH(comment)) FROM test;
+----------------------+
| MAX(LENGTH(comment)) |
+----------------------+
| 5000 |
+----------------------+
1 row in set (0.01 sec)