mysql - 将 4 字节的 unicode 字符插入 MySQL/MariaDB
问题描述
当尝试插入时(例如,这是一个 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)
谁能指出我正确的方向?
解决方案
是的,正如您评论的那样,您需要使用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,因此您无需更改它。
推荐阅读
- azure - 具有两个应用程序的 Azure 应用程序服务计划的 100% 内存使用率 - 工作集使用 10gb+
- list - 无法从 cmake 中的列表中提取项目
- r - 如何将 R 中的 gmnl 函数应用于离散选择实验的潜在类分析?
- python - 如何修复“python中的pool.map问题”
- python - 是否有一个 python 函数用于将两个 3D 图像的体素值相加,存储在列表中,并将输出存储在另一个列表中
- android - 为什么为回收站请求布局会停止布局操作?
- excel - 在 Debug.Print 中返回 5 位日期而不格式化单元格
- python-3.x - 为未分配 EIP 的已停止实例确定实例 IP 或 DNS
- javascript - 将打开一个 div 关闭上一个
- operator-precedence - 编程语言的运算符评估顺序的技术术语是什么?