我在一个表中有一个字段引用另一个表中的字段。外键约束正常工作,但如果我在引用表的字段末尾添加(UPDATE)一个额外的空格字符,则不会强制执行约束,即使值不同也允许更新。
这是否与varchars的工作方式有关或者这是一个主要错误?当我们发现它时,我们感到非常惊讶。有什么想法吗?
在MariaDB版本10.0.14和5.5.35上确认。
谢谢!
答案 0 :(得分:3)
据我所知,外键约束使用=
的规则进行验证。这意味着它遵循两列的排序规则(应该具有相同的排序规则)。它还意味着忽略字符串末尾的空格。
根据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
或=
次比较。 。 强>
因为连接条件可能使用=
,所以这种比较对于外键比较是有意义的。