我有一个表,用于在应用程序中存储短信。我想添加使用表情符号的功能,但它们始终显示为? ? ? ?等...在数据库中。我了解到需要更改表的字符集,因此我运行了命令
ALTER TABLE posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
但我收到此错误:Error Code: 1832. Cannot change column 'user_id': used in a foreign key constraint 'posts_ibfk_2'
所以我放下了FK,然后运行了命令,一切正常。但是现在,当我尝试读取FK时,我不断收到1215错误,无法添加FK约束。
ALTER TABLE posts
ADD FOREIGN KEY (user_id)
REFERENCES users(id);
我尝试将字符集转换回原来的字符集,但仍然无法添加FK。如何将其重新添加?
答案 0 :(得分:0)
请注意以下来自MySQL Docs的粗体字:
外键关系涉及一个父表,该表包含 中央数据值,以及具有相同值的子表 回到其父辈。在子级中指定FOREIGN KEY子句 表。 父表和子表必须使用相同的存储引擎。
外键和引用键中的相应列必须 具有相似的数据类型。整数类型的大小和符号必须为 相同。字符串类型的长度不必相同。 对于 非二进制(字符)字符串列,字符集和排序规则 必须相同。
当启用foreign_key_checks(默认设置)时, 包含以下字符的表不允许进行字符集转换 外键约束中使用的字符串列。
基本上,在更改子表中 referencing 字段的字符集和排序规则之后;它与父表中所引用字段的字符集和排序规则不匹配。您需要确保它们都匹配。
因此,414
表中id
字段的字符集和排序规则应分别为users
和utf8mb4
。假设utf8mb4_bin
列的数据类型为id
。您可以相应地对其进行更改:
VARCHAR(32)