"VARCHAR(255)CHARACTER SET utf8"是255个字节还是255个字符

bra*_*ing 5 mysql unicode varchar truncate utf-8

我在INNODB/MySQL表中声明了一个字段

VARCHAR(255) CHARACTER SET utf8 NOT NULL
Run Code Online (Sandbox Code Playgroud)

但是当插入我的数据被截断为255字节而不是字符.这可能会破坏尾随的两个咬合代码点,我强调文本 n两个留下一个无效的字符.任何想法我可能做错了什么

编辑:

示例会话是这样的

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)
Run Code Online (Sandbox Code Playgroud)

通过mysql-admin我查看注释字段,看看它确实是VARCHAR(255)并使用"UTF-8 Unicode"

从命令

show full columns from channel
Run Code Online (Sandbox Code Playgroud)

我明白了

+-----------------------------+------------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+
| 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 |         |
+-----------------------------+------------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+
Run Code Online (Sandbox Code Playgroud)

mysql> SHOW VARIABLES LIKE'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/ |
+--------------------------+----------------------------+
Run Code Online (Sandbox Code Playgroud)

Pek*_*ica 7

根据手册,你应该没事:

MySQL以字符为单位解释字符列定义中的长度规范.(在MySQL 4.1之前,列长度以字节为单位进行解释.)这适用于CHAR,VARCHAR和TEXT类型.

你碰巧使用4.1之前版本的mySQL吗?

  • 哇.对不起,我不相信你.实际上它是MySQL≥4.1的字符.我会删除错误的答案.(对于记录:实现字符限制的存储计算如下:M×w字节,0 <= M <= 255,其中w是字符集中最大长度字符所需的字节数.) (4认同)

Ham*_*ite 2

这是在黑暗中进行的尝试,但是您是否使用 UTF-8 作为连接和客户端字符集?发出SHOW VARIABLES LIKE 'character_set%'并查看它是否告诉您 UTF-8 还是 latin-1。

如果您使用了错误的连接/客户端字符集,UTF-8 字节可能会被重新解释为单字节字符并以这种方式存储在数据库中。