将 4 字节 unicode 字符插入 MySQL/MariaDB
Inserting 4-byte unicode characters into MySQL/MariaDB
尝试插入时(例如,这是一个 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 ('');
这是我的数据库 charset/collation:
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
table:
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)
任何人都可以指出正确的方向吗?
是的,正如您评论的那样,您需要使用 SET NAMES utf8mb4
。
您的 4 字节字符必须从您的客户端通过数据库连接传递到 table。所有这些都必须支持 utf8mb4。如果其中任何一个不支持utf8mb4,那么4字节的字符将无法通过。
SET NAMES utf8mb4
使数据库会话期望客户端使用该编码发送字符串。 MySQL 5.7上的character_set_client
默认是utf8,所以需要设置为utf8mb4。
在MySQL 8.0.1及以后的版本中,默认的character_set_client
已经是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 ('');
这是我的数据库 charset/collation:
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
table:
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)
任何人都可以指出正确的方向吗?
是的,正如您评论的那样,您需要使用 SET NAMES utf8mb4
。
您的 4 字节字符必须从您的客户端通过数据库连接传递到 table。所有这些都必须支持 utf8mb4。如果其中任何一个不支持utf8mb4,那么4字节的字符将无法通过。
SET NAMES utf8mb4
使数据库会话期望客户端使用该编码发送字符串。 MySQL 5.7上的character_set_client
默认是utf8,所以需要设置为utf8mb4。
在MySQL 8.0.1及以后的版本中,默认的character_set_client
已经是utf8mb4了,所以你不需要改变它。