Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL选择包含前导或尾随空格的字段_Mysql_Sql_Trim - Fatal编程技术网

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

MySQL选择包含前导或尾随空格的字段,mysql,sql,trim,Mysql,Sql,Trim,我可以使用MySQL TRIM方法清理包含前导或尾随空格的字段,更新如下: 我希望在运行此操作之前实际查看此操作将影响的字段。我尝试了此操作,但返回0个结果: SELECT * FROM Foo WHERE field != TRIM(field); 看起来这应该行得通,但实际上不行 有人有办法吗?另外,我想知道为什么这不起作用…如以下文件所述: SELECT * FROM `foo` WHERE (name LIKE ' %') OR (name LIKE '% '

我可以使用MySQL TRIM方法清理包含前导或尾随空格的字段,更新如下:

我希望在运行此操作之前实际查看此操作将影响的字段。我尝试了此操作,但返回0个结果:

SELECT * FROM Foo WHERE field != TRIM(field);
看起来这应该行得通,但实际上不行

有人有办法吗?另外,我想知道为什么这不起作用…

如以下文件所述:

SELECT *
FROM 
    `foo`
WHERE 
   (name LIKE ' %')
OR 
   (name LIKE '% ')
所有MySQL排序规则都是PADSPACE类型。这意味着比较MySQL中的所有CHAR和VARCHAR值时,不考虑任何尾随空格

在操作员的定义中,手册规定:

特别是,尾随空格非常重要,这对于运算符或与运算符执行的比较是不正确的:

如中所述:

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

从草案8.2中:

如果X的字符长度不等于Y的字符长度,则为了比较的目的,较短的字符串将被有效地替换为一个副本,该副本通过在一个或多个填充字符的右侧串联而扩展到较长字符串的长度,其中,根据CS选择焊盘字符。如果CS具有无填充字符特性,则填充字符是与实现相关的字符,不同于X和Y字符集中的任何字符,该字符的排序少于CS下的任何字符串。否则,填充字符是一个字符

一个解决方案:

SELECT * FROM Foo WHERE CHAR_LENGTH(field) != CHAR_LENGTH(TRIM(field))
下面是一个例子


另一种解决方案是使用和来比较字符串的最后和第一个字符与空白字符列表

SUBSTRING@s,1,1在“”、'\t'、'\n'、'\r'或SUBSTRING@s,-1,1在“”,'\t','\n','\r' …其中@s是任何输入字符串。根据您的案例需要,在比较列表中添加其他空白字符

下面是一个简单的测试,演示该表达式在各种字符串输入中的行为:

设置@s_normal='x'; 设置@s_ws_前导='\tx'; 设置@s_ws_training='x'; 设置@s_ws_both='\rx'; 选择 NOTSUBSTRING@s_normal,1,1在“”、'\t'、'\n'、'\r'或SUBSTRING@s_normal,-1,1英寸,'\t','\n','\r'测试\u正常=>1次通过 , SUBSTRING@s_ws_leading,1,1在“”、'\t'、'\n'、'\r'或SUBSTRING@s_ws_leading,-1,1英寸,'\t','\n','\r'测试\u ws\u前导=>1次通过 , SUBSTRING@s_ws_trailing,1,1在“”、'\t'、'\n'、'\r'或SUBSTRING@s_ws_trailing,-1,1英寸,'\t','\n','\r'测试\u ws\u跟踪=>1次通过 , SUBSTRING@s_ws_both,1,1在“”、'\t'、'\n'、'\r'或SUBSTRING@s_ws_both,-1,1英寸,'\t','\n','\r'测试\u ws\u两者=>1次通过 ; 如果这是你将要做的很多事情,你也可以为它创建一个函数:

DROP函数(如果存在)有\u前导\u或\u尾随\u空格; CREATE函数具有\u前导\u或\u尾随\u空格VARCHAR2000 返回布尔值 确定性 返回子字符串,1,1在“”、'\t'、'\n'、'\r'中,或子字符串,-1,1在“”、'\t'、'\n'、'\r' ; 测验 选择 没有领先或落后_whitespace@s_normal=>1次通过 ,具有前导或尾随_whitespace@s_ws_leading=>1次通过 ,具有前导或尾随_whitespace@s_ws_trailing=>1次通过 ,具有前导或尾随_whitespace@s_ws_both=>1次通过 ;
请参见以下答案:同样,对于!=,试试@David:!=vs似乎没有什么区别。eggyal解释了尾随空格。给定查询结果,可以安全地假设所有值都没有前导空格。正确!根据MySQL中的这一被充分证明的特性,比如前面和后面的空格,其中As=nots:@patrickbasut假设,由空格表示OP,而不仅仅是U+0020,这是唯一正确的答案。
SELECT * FROM Foo WHERE CHAR_LENGTH(field) != CHAR_LENGTH(TRIM(field))
SELECT *
FROM 
    `foo`
WHERE 
   (name REGEXP '(^[[:space:]]|[[:space:]]$)')