一尘不染

MySQL选择包含前导或尾随空格的字段

sql

我可以使用MySQLTRIM()方法来清理包含前导或尾随空格的字段,UPDATE如下所示:

UPDATE Foo SET field = TRIM(field);

我想实际看到这将在运行之前影响的字段。我试过了,但返回0个结果:

SELECT * FROM Foo WHERE field != TRIM(field);

似乎这样应该可以,但是不能。

有人有解决办法吗?另外,很好奇为什么这不起作用…


阅读 139

收藏
2021-03-17

共1个答案

一尘不染

TheCHARVARCHARTypes所述

所有MySQL归类均为PADSPACE。这意味着将比较MySQL中的allCHARVARCHARvalue而不考虑任何尾随空格。

LIKE操作员的定义中,手册指出:

特别是,尾随空格很重要,这不适用于运算符CHARVARCHAR=运算符进行比较:

就像在这个答案中提到的:

SQL-92和SQL:2008中指定了此行为。为了进行比较,将较短的字符串填充为较长的字符串的长度。

从草案(8.2 <比较谓词>)中:

如果X字符的长度不等于Y字符的长度,则出于比较目的,较短的字符串将有效地替换为自身的副本,该副本已通过串联扩展为较长的字符串的长度在一个或多个填充字符的右侧,其中填充字符是根据CS选择的。如果CS具有NOPAD特性,则填充字符是与实现相关的字符,不同于X和Y字符集中的任何字符,其比CS下的任何字符串都少。否则,填充字符为<space>

一种解决方案:

SELECT * FROM Foo WHERE CHAR_LENGTH(field) != CHAR_LENGTH(TRIM(field))
2021-03-17