具有额外空白的MariaDB VARCHAR外键引用

时间:2014-11-19 20:47:31

标签: mysql foreign-keys varchar mariadb

我在一个表中有一个字段引用另一个表中的字段。外键约束正常工作,但如果我在引用表的字段末尾添加(UPDATE)一个额外的空格字符,则不会强制执行约束,即使值不同也允许更新。

这是否与varchars的工作方式有关或者这是一个主要错误?当我们发现它时,我们感到非常惊讶。有什么想法吗?

在MariaDB版本10.0.14和5.5.35上确认。

谢谢!

1 个答案:

答案 0 :(得分:3)

据我所知,外键约束使用=的规则进行验证。这意味着它遵循两列的排序规则(应该具有相同的排序规则)。它还意味着忽略字符串末尾的空格。

根据documentation

  

根据SQL标准,LIKE基于每个字符执行匹配,   因此它可以产生与=比较运算符不同的结果:

mysql> SELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci;

+-----------------------------------------+
| 'ä' LIKE 'ae' COLLATE latin1_german2_ci |
+-----------------------------------------+
|                                       0 |
+-----------------------------------------+

mysql> SELECT 'ä' = 'ae' COLLATE latin1_german2_ci;

+--------------------------------------+
| 'ä' = 'ae' COLLATE latin1_german2_ci |
+--------------------------------------+
|                                    1 |
+--------------------------------------+
     

特别是,尾随空格很重要,但事实并非如此   与CHAR运算符执行了VARCHAR=次比较。 。

因为连接条件可能使用=,所以这种比较对于外键比较是有意义的。