我可以使用MySQLTRIM()方法来清理包含前导或尾随空格的字段,UPDATE如下所示:
TRIM()
UPDATE
UPDATE Foo SET field = TRIM(field);
我想实际看到这将在运行之前影响的字段。我试过了,但返回0个结果:
SELECT * FROM Foo WHERE field != TRIM(field);
似乎这样应该可以,但是不能。
有人有解决办法吗?另外,很好奇为什么这不起作用…
如TheCHAR和VARCHARTypes所述:
CHAR
VARCHAR
所有MySQL归类均为PADSPACE。这意味着将比较MySQL中的allCHAR和VARCHARvalue而不考虑任何尾随空格。
PADSPACE
在LIKE操作员的定义中,手册指出:
LIKE
特别是,尾随空格很重要,这不适用于运算符CHAR或VARCHAR与=运算符进行比较:
=
就像在这个答案中提到的:
SQL-92和SQL:2008中指定了此行为。为了进行比较,将较短的字符串填充为较长的字符串的长度。 从草案(8.2 <比较谓词>)中: 如果X字符的长度不等于Y字符的长度,则出于比较目的,较短的字符串将有效地替换为自身的副本,该副本已通过串联扩展为较长的字符串的长度在一个或多个填充字符的右侧,其中填充字符是根据CS选择的。如果CS具有NOPAD特性,则填充字符是与实现相关的字符,不同于X和Y字符集中的任何字符,其比CS下的任何字符串都少。否则,填充字符为<space>。
SQL-92和SQL:2008中指定了此行为。为了进行比较,将较短的字符串填充为较长的字符串的长度。
从草案(8.2 <比较谓词>)中:
如果X字符的长度不等于Y字符的长度,则出于比较目的,较短的字符串将有效地替换为自身的副本,该副本已通过串联扩展为较长的字符串的长度在一个或多个填充字符的右侧,其中填充字符是根据CS选择的。如果CS具有NOPAD特性,则填充字符是与实现相关的字符,不同于X和Y字符集中的任何字符,其比CS下的任何字符串都少。否则,填充字符为<space>。
<space>
一种解决方案:
SELECT * FROM Foo WHERE CHAR_LENGTH(field) != CHAR_LENGTH(TRIM(field))