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

Mic*_*rey 25 mysql sql trim

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

UPDATE Foo SET field = TRIM(field);
Run Code Online (Sandbox Code Playgroud)

我想在运行之前看到这些影响的字段.我尝试了这个,但返回0结果:

SELECT * FROM Foo WHERE field != TRIM(field);
Run Code Online (Sandbox Code Playgroud)

似乎这应该工作,但事实并非如此.

有人有解决方案吗?此外,好奇为什么这不起作用......

egg*_*yal 48

正如The CHARVARCHARTypes中所述:

所有MySQL排序规则都是类型PADSPACE.这意味着比较MySQL中的所有值CHARVARCHAR值,而不考虑任何尾随空格.

LIKE运算符的定义中,手册指出:

特别地,尾部空格是显著,这是不为真CHARVARCHAR与所执行的比较=操作符:

正如这个答案中提到的:

此行为在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))
Run Code Online (Sandbox Code Playgroud)


use*_*035 29

SELECT *
FROM 
    `foo`
WHERE 
   (name LIKE ' %')
OR 
   (name LIKE '% ')
Run Code Online (Sandbox Code Playgroud)


小智 5

这是一个使用RegEx的示例

SELECT *
FROM 
    `foo`
WHERE 
   (name REGEXP '(^[[:space:]]|[[:space:]]$)')
Run Code Online (Sandbox Code Playgroud)