从字符串中选择修剪空格 - 这是一个错误还是在规范中?

时间:2009-12-22 16:42:56

标签: mysql

在mysql中:

select 'a' = 'a     ';

返回1

5 个答案:

答案 0 :(得分:5)

not the first发现这令人沮丧。在这种情况下,使用LIKE进行文字字符串比较:

SELECT 'a' LIKE 'a    ';    //returns 0

答案 1 :(得分:2)

我用Google搜索“mysql string”并找到了this

  

特别是,尾随空格[使用LIKE]是重要的,对于使用=运算符执行的CHAR或VARCHAR比较不适用

答案 2 :(得分:2)

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

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

如果X的字符长度不等于Y的字符长度,那么为了进行比较,较短的字符串会被有效地替换为已经扩展到长度的自身副本通过在一个或多个填充字符的右侧连接的较长字符串,其中填充字符是基于CS选择的。如果CS具有NO PAD特性,则填充字符是与实现有关的字符,不同于X和Y字符集中的任何字符,其整理的字符串少于CS下的任何字符串。否则,填充字符是< space>。

除了其他优秀的解决方案:

select binary 'a' = 'a   '

答案 3 :(得分:0)

来自documentation

  

所有MySQL归类都属于PADSPACE类型。这意味着CHAR中的所有VARCHARMySQL值都会进行比较,而不考虑任何尾随空格

尾随空格存储在VARCHAR中的MySQL 5.0.3+

CREATE TABLE t_character (cv1 CHAR(10), vv1 VARCHAR(10), cv2 CHAR(10), vv2 VARCHAR(10));

INSERT
INTO    t_character
VALUES  ('a', 'a', 'a ', 'a ');

SELECT  CONCAT(cv1, cv1), CONCAT(vv2, vv1)
FROM    t_character;

但未用于比较。

答案 4 :(得分:0)

这是另一种可能有用的解决方法:

select 'a' = 'a     ' and length('a') = length('a     ');

返回0