【发布时间】: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。
-
我在这些系统变量中看到了很多“utf8”。应该都是“utf8mb4”。
-
是的,我的都是 'utf8mb4' 除了
character_set_system不能更改。 -
我改变了变量,它保持不变,我更新了问题