Является ли "VARCHAR (255) CHARACTER SET utf8" 255 байтами или 255 символами - PullRequest
5 голосов
/ 12 августа 2010

Я объявил поле в своей таблице INNODB / MySQL как

VARCHAR(255) CHARACTER SET utf8 NOT NULL

однако при вставке мои данные усекаются до 255 байтов, а не символов. это может расколоть конечную двухточечную кодовую точку i выделенный текст n two, оставляя недопустимый символ. Любые идеи, что я могу делать неправильно

EDIT:

Пример сессии такой:

mysql> update channel set comment="ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ ᛋᚳᛖᚪᛚ᛫ᚦᛖᚪᚻ᛫ᛗᚪᚾᚾᚪ᛫ᚷᛖᚻᚹᛦᛚᚳ᛫ᛗᛁᚳᛚᚢᚾ᛫ᚻᛦᛏ᛫ᛞᚫᛚᚪᚾᚷᛁᚠ᛫ᚻᛖ᛫ᚹᛁᛚᛖ᛫ᚠᚩᚱ᛫ᛞᚱᛁᚻᛏᚾᛖ᛫ᛞᚩᛗᛖᛋ᛫ᚻᛚᛇᛏᚪᚾ᛬x" where id = 1;
Query OK, 0 rows affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 1

mysql> select id, channelName, comment from channel;
+----+-------------+------------------------------------------------------------------------------------------
| id | channelName | comment                                                                                                                                                                                                                                                         |
+----+-------------+-----------------------------------------------------------------------------------------
|  1 | foo         | ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ ᛋᚳᛖᚪᛚ᛫ᚦᛖᚪᚻ᛫ᛗᚪᚾᚾᚪ᛫ᚷᛖᚻᚹᛦᛚᚳ᛫ᛗᛁᚳᛚᚢᚾ᛫ᚻᛦᛏ᛫ᛞᚫᛚᚪᚾᚷᛁᚠ᛫ᚻᛖ᛫ᚹᛁᛚᛖ᛫ᚠᚩ�� |
+----+-------------+-----------------------------------------------------------------------------------------
1 row in set (0.00 sec)

через mysql-admin Я смотрю на поле для комментариев и вижу, что это действительно VARCHAR (255) и использует UTF-8 Unicode

из команды

show full columns from channel

Я получаю

+-----------------------------+------------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+
| Field                       | Type             | Collation       | Null | Key | Default | Extra          | Privileges                      | Comment |
+-----------------------------+------------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+
| id                          | int(11)          | NULL            | NO   | PRI | NULL    | auto_increment | select,insert,update,references |         |
| channelName                 | varchar(255)     | utf8_general_ci | NO   |     | NULL    |                | select,insert,update,references |         |
| comment                     | varchar(255)     | utf8_general_ci | NO   |     | NULL    |                | select,insert,update,references |         |
+-----------------------------+------------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+

mysql> ПОКАЗАТЬ ПЕРЕМЕННЫЕ НРАВИТСЯ 'character_set%'

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

Ответы [ 2 ]

7 голосов
/ 12 августа 2010

В соответствии с руководством , все должно быть в порядке:

MySQL интерпретирует спецификации длины в определениях символьных столбцов в символьных единицах.(До MySQL 4.1 длины столбцов интерпретировались в байтах.) Это относится к типам CHAR, VARCHAR и TEXT.

Возможно, вы используете версию MySQL до 4.1?

2 голосов
/ 12 августа 2010

Это удар в темноте, но вы используете UTF-8 в качестве соединения и клиентских наборов символов?Введите SHOW VARIABLES LIKE 'character_set%' и посмотрите, сообщает ли он вам UTF-8 или латиницу-1.

Возможно, если вы используете неправильные наборы символов подключения / клиента, байты UTF-8 будут интерпретироваться как однобайтовые символы ихранится таким образом в базе данных.

...