【问题标题】:Inserting 4-byte unicode characters into MySQL/MariaDB将 4 字节的 unicode 字符插入 MySQL/MariaDB
【发布时间】:2019-08-28 10:43:17
【问题描述】:

当尝试插入 ???? (例如,这是一个 4 字节的 unicode char),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)

谁能指出我正确的方向?

【问题讨论】:

  • 完成这项工作的唯一方法是在我的INSERT 之前执行SET NAMES utf8mb4。这是唯一的方式吗?
  • BTW - 代码点是 Unicode 字符集中的 21 位。它是 Unicode 的 UTF-8 字符编码,它对某些代码点使用 4 个 8 位代码单元。 “4-byte Unicode char”听起来很奇怪,并且与两个 UTF-16 代码单元和 1 个 UTF-32 代码单元有歧义。
  • @infomaniac - 通常“更好”的方式在客户端使用的“连接参数”中可用。 (每个客户端都以不同的方式执行此操作。)SET NAMES 是一个备用方案,如果您没有(或不使用)连接参数,则可以使用。

标签: mysql unicode utf-8 utf8mb4


【解决方案1】:

是的,正如您评论的那样,您需要使用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,因此您无需更改它。

【讨论】:

    猜你喜欢
    • 2017-09-21
    • 1970-01-01
    • 2012-06-03
    • 2013-07-05
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 2012-10-17
    相关资源
    最近更新 更多