4

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)

何故ですか?

4

4 に答える 4

7

問題は、LENGTH()が文字ではなくバイト単位で長さを返すことです。文字列はUTF-8であるため、代わりにCHAR_LENGTH()を使用する必要があります。

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)

文字列に2バイト文字が1つだけ含まれているため、長さは5001でした。

于 2012-11-06T05:22:35.977 に答える
2
       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.
于 2012-11-06T04:51:14.373 に答える
1

VARCHAR の有効な最大長は 65,535 バイトです。VARCHAR 列を作成した数 5,000 は、実際には VARCHAR 列の許容ストレージの長さを制限しません。これは、CHAR データ型とは異なる動作です。

11.4.1. CHAR および VARCHAR 型

于 2012-11-06T04:48:59.220 に答える
0

5000 は 0 から始まり、5001 文字を与えることにカウントされます。それは 5002 ですか?

于 2012-11-06T04:38:20.917 に答える