我可以使用MySQL TRIM()
方法用UPDATE
清理包含前导或尾随空格的字段,如下所示:
UPDATE Foo SET field = TRIM(field);
我想在运行之前看到这些影响的字段。我尝试了这个,但返回0结果:
SELECT * FROM Foo WHERE field != TRIM(field);
似乎这应该工作,但事实并非如此。
有人有解决方案吗?此外,好奇为什么这不起作用......
如The CHAR
and VARCHAR
Types所述:
所有MySQL排序规则都是
PADSPACE
类型。这意味着MySQL中的所有CHAR
和VARCHAR
值都会进行比较,而不考虑任何尾随空格。
在LIKE
运算符的定义中,手册指出:
如this answer中所述:
此行为在SQL-92和SQL:2008中指定。出于比较的目的,较短的字符串被填充到较长字符串的长度。
从草案(8.2 <比较谓词>):
如果X的字符长度不等于Y的字符长度,那么为了比较的目的,较短的字符串被有效地替换为已经通过连接扩展到较长字符串的长度的自身的副本。在一个或多个填充字符的右侧,其中填充字符是基于CS选择的。如果CS具有NO PAD特性,则填充字符是与实现有关的字符,不同于X和Y字符集中的任何字符,其整理的字符串少于CS下的任何字符串。否则,填充字符是<space>。
一个解决方案
SELECT * FROM Foo WHERE CHAR_LENGTH(field) != CHAR_LENGTH(TRIM(field))
SELECT *
FROM
`foo`
WHERE
(name LIKE ' %')
OR
(name LIKE '% ')
这是RegEx的一个例子
SELECT *
FROM
`foo`
WHERE
(name REGEXP '(^[[:space:]]|[[:space:]]$)')