MySQL大小写敏感的文本数据外键

3

我在主表中有ISO 639-2语言代码(eng、fre、hin等)作为主键。这一列是其他许多表中的外键。现在我的问题是,尽管我的主表只有小写值,但由于人为错误,有些值以混合大小写的语言ID添加到了其他表中。即使有外键,也无法防止这种情况的发生。
现在这是我第一次使用MySQL,之前我使用的是Oracle,并且它对键区分大小写。如何在MySQL中实现相同的功能? 此外,列类型应该是什么?
现在它是varchar(3)。我应该将其转换为其他类型吗?我不会在任何查询中使用like条件,只会使用=in

1个回答

5

这是因为列的排序规则是不区分大小写的,类似于latin1_swedish_ci。将其更改为区分大小写的排序规则 - latin1_swedish_cs。

ALTER TABLE t1 MODIFY col1 VARCHAR(3) CHARACTER SET latin1 COLLATE latin1_swedish_cs;

链接文本


你可能需要先运行形如 UPDATE table SET column = LOWER(column) 的查询,以使数据变为小写。 - Hammerite
@Hammerite 我更愿意在数据库层面上进行这个检查,而不是在代码层面上。作为一个程序员,现在我可以从我的代码中控制所有的插入操作,但是几年后,其他人可能会在他的代码中忽略它,并进一步引起问题。 - Ashish Patil
让我在我的测试数据库中检查您的建议,我希望这可以解决问题。我只需要更改主表还是所有其他引用列也需要更改? 另一个建议是将列更改为varchar二进制。这会有帮助吗? - Ashish Patil
在更改表以修复无效值之前,您必须更新数据。 更改所有表,字符集必须相同。 如果所有记录仅包含小写拉丁字母,则列是否区分大小写或二进制并不重要。 - Naktibalda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接