在MySQL / MariaDB中插入4字节unicode字符

时间:2019-04-06 21:59:55

标签: mysql unicode utf-8 utf8mb4

当尝试插入时(例如,它是一个4字节的Unicode字符),MySQL(5.7)和MariaDB(10.2 / 10.3 / 10.4)都给出相同的错误:

Incorrect string value: '\xF0\x9F\x92\xA9'

声明:

mysql> insert into bob (test) values ('');

这是我数据库的字符集/排序规则:

mysql> select @@collation_database;                                                                     +----------------------+
| @@collation_database |
+----------------------+
| utf8mb4_unicode_ci   |
+----------------------+
1 row in set (0.00 sec)

mysql> SELECT @@character_set_database;                                                                 +--------------------------+
| @@character_set_database |
+--------------------------+
| utf8mb4                  |
+--------------------------+
1 row in set (0.00 sec)

服务器的字符集:

mysql> show global variables like '%character_set_server%'\G;                                           *************************** 1. row ***************************
Variable_name: character_set_server
        Value: utf8mb4

表格:

create table bob ( `test` TEXT NOT NULL );
mysql> SHOW FULL COLUMNS FROM bob;
+-------+------+--------------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation          | Null | Key | Default | Extra | Privileges                      | Comment |
+-------+------+--------------------+------+-----+---------+-------+---------------------------------+---------+
| test  | text | utf8mb4_unicode_ci | NO   |     | NULL    |       | select,insert,update,references |         |
+-------+------+--------------------+------+-----+---------+-------+---------------------------------+---------+
1 row in set (0.00 sec)

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

是的,正如您所评论的,您需要使用SET NAMES utf8mb4

您的4字节字符必须从客户端通过数据库连接传递到表中。所有这些都必须支持utf8mb4。如果其中任何一个不支持utf8mb4,则4字节字符将无法通过。

SET NAMES utf8mb4使数据库会话期望客户端使用该编码发送字符串。在MySQL 5.7上,character_set_client的默认值为utf8,因此您需要将其设置为utf8mb4。

在MySQL 8.0.1和更高版本中,默认的character_set_client已经是utf8mb4,因此您无需更改它。