我有一个数据库,我要求在一个表中只有两个字段允许存储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
字段的"名称";和";proposal"似乎有uft8mb4_bin排序,并且在运行命令时没有显示错误。但是,当我尝试在那里保存一个值时,例如"Seguridad🍞",它给了我错误
ERROR 1366 (HY000): Incorrect string value: 'xF0x9Fx8Dx9E' 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字节的表情符号。
这不是表格的错;这是一种联系。比如:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
...
'OPTIONS': {
'charset': 'utf8mb4',
'use_unicode': True, },
},
}