在mysql中添加char类型的外键

Mar*_*sen 4 mysql foreign-keys char column-types

我在mysql中添加外键时遇到了问题(使用phpmyadmin).

ALTER TABLE `production_x_country` ADD  FOREIGN KEY (`country`) REFERENCES `pmdb_0.3.12`.`countries`(`iso_3166_1`) ON DELETE CASCADE ON UPDATE CASCADE;
Run Code Online (Sandbox Code Playgroud)

#1215 - 无法添加外键约束

基于一些研究和测试,我得出的结论是CHAR(那个production_x_country.country字段) 没有有效的外键字段类型 - 尽管我没有在mysql文档中找到任何暗示.如果我将列类型更改为其他类型的字符类型VARCHAR,则该过程有效.

类似的问题在这里得到了"解决",但是这个链接的答案不是类型问题,而是关于国家代码是主键(对我来说是完全合理的):https://stackoverflow.com/a/1419235/4302731


表格说明:

CREATE TABLE IF NOT EXISTS `countries` (
  `iso_3166_1` char(3) NOT NULL,  <----- primary key to be referenced to
  `name` varchar(200) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `countries` ADD PRIMARY KEY (`iso_3166_1`);



CREATE TABLE IF NOT EXISTS `production_x_country` (
  `production` int(11) NOT NULL,
  `country` char(3) CHARACTER SET utf8 NOT NULL   <----- column that should hold the foreign key
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Run Code Online (Sandbox Code Playgroud)

是否有任何解决方案(是的,我可以继续使用varchar,但那不满意我)?最重要的:有什么解释吗?

谢谢您的帮助!


解决了 - 请看下面我自己的答案

Mar*_*sen 7

解决了!这不是关于char字段类型,而是关于整理!

我喜欢使用UTF-8,主要是utf8_bin.我的主键校对也是如此:

`iso_3166_1` char(3) CHARACTER SET utf8
Run Code Online (Sandbox Code Playgroud)

一旦我将主键的排序规则改为"latin1_swedish_ci",外键应用程序就可以了.引出了一个问题:为什么主键字段的排序(也许还有外键字段,还没有检查过)很重要?