为啥我不能在这个 mysql 字段中存储 4 字节的表情符号?

Posted

技术标签:

【中文标题】为啥我不能在这个 mysql 字段中存储 4 字节的表情符号?【英文标题】:Why can't I store 4 byte emojis in this mysql field?为什么我不能在这个 mysql 字段中存储 4 字节的表情符号? 【发布时间】:2021-05-27 05:57:23 【问题描述】:

我有一个数据库,我要求一个表中只有两个字段允许存储 4 字节的表情符号。我这样做了(显然使用了正确的表名和列名):

ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

我知道它有效,因为当我执行 show create table chatbots_proposalarea; 时,它会告诉我:

CREATE TABLE `chatbots_proposalarea` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) COLLATE utf8mb4_bin NOT NULL,
  `proposal` varchar(1500) COLLATE utf8mb4_bin DEFAULT NULL,
  `candidate_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `chatbots_proposalare_candidate_id_6465160e_fk_chatbots_` (`candidate_id`),
  CONSTRAINT `chatbots_proposalare_candidate_id_6465160e_fk_chatbots_` FOREIGN KEY (`candidate_id`) REFERENCES `chatbots_candidate` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

“名称”和“提案”字段似乎确实具有 uft8mb4_bin 排序规则,并且在运行命令时没有显示错误。但是,当我尝试在那里保存一个值时,例如“Seguridad ????”,它给了我错误

ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x8D\x9E' for column 'name' at row 1

任何帮助发现我缺少什么将不胜感激。

注意事项

这是一个Django项目,安装在Ubuntu服务器上,SQL版本是mysql Ver 14.14 Distrib 5.7.28, for Linux (x86_64) 我不明白为什么会有所作为,但是当我通过这样做直接更新到数据库时也会发生同样的情况

UPDATE chatbots_proposalarea SET name='Seguridad ????' where id=1;

推荐了一种解决方案,但该解决方案取决于触发器的使用,这就是问题的原因,这不是我的情况。

更新

如果它显示任何重要信息,当我运行show variables where Variable_name like 'character\_set\_%' or Variable_name like 'collation%'; 我得到以下信息:

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_general_ci |
| collation_database       | utf8mb4_general_ci |
| collation_server         | utf8mb4_general_ci |
+--------------------------+--------------------+

我将这些值更改为一位同事在他的一个项目中的值,他还需要在其中存储 4 字节的表情符号。

【问题讨论】:

我对此进行了测试,它对我有用。使用 MySQL 5.7.27。 这能回答你的问题吗? Trouble inserting 4-Byte UTF-8 characters / emoji into MySQL Database when insert trigger is active 我在这些系统变量中看到了很多“utf8”。应该都是“utf8mb4”。 是的,我的都是 'utf8mb4' 除了 character_set_system 不能更改。 我改变了变量,它保持不变,我更新了问题 【参考方案1】:

这不是桌子的错;这是连接。比如:

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.mysql',
        ...
        'OPTIONS': 
                    'charset': 'utf8mb4',
                    'use_unicode': True, ,
    ,

【讨论】:

虽然当我直接在 mysql 控制台上直接执行 UPDATE 语句时也会发生同样的情况,但事实并非如此,或者会这样吗?不仅仅是当我通过 Django 更新时。 每个连接控制自己的字符集(等)选项。我展示的是 Django。命令行“mysql”工具可以在运行查询之前使用SET NAMES utf8mb4;

以上是关于为啥我不能在这个 mysql 字段中存储 4 字节的表情符号?的主要内容,如果未能解决你的问题,请参考以下文章

Mysql字节数组存储

mysql varchar 最大可以设置多少

MySQL - 为啥不索引每个字段?

MySQL 的最佳 varchar 大小是多少?

为啥枚举的构造函数不能访问静态字段?

(紧急)mysql字段类型转换成utf16