Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么MySQL VARCHAR允许超过最大长度?_Mysql_Varchar - Fatal编程技术网

为什么MySQL VARCHAR允许超过最大长度?

为什么MySQL VARCHAR允许超过最大长度?,mysql,varchar,Mysql,Varchar,我用UTF-8VARCHAR(5000)创建了一个表,并用数据填充它。 但看起来该字段允许的数据比指示的要多: mysql> DESCRIBE test; +---------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+----------------

我用UTF-8
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)