在比较中需要考虑varchar中的尾随空格

时间:2010-09-08 14:52:40

标签: mysql

我正在使用带varchar列的表。我没有意识到在比较中没有考虑尾随空格(显然,两个仅在尾随空格量方面不同的值将违反唯一性属性,如果指定的话)。

我需要在表格中修复此问题,最好是在适当的位置。是否有推荐的路径在MySQL中修复这样的表?

我正在通过我控制的程序严格访问数据库,因此切换到非人类可读的格式(如二进制文件)就可以了。但我不知道怎么做这样的事情,也不想破坏这张桌子。

4 个答案:

答案 0 :(得分:10)

我必须假设您使用的是MySQL 5.x,因为MySQL 4.x不会在VARCHAR列中存储尾随空格。

如您所示,在MySQL中使用标准=运算符,不考虑尾随空格:

SELECT 'this' = 'this '返回TRUE

但是,LIKE逐个字符地比较字符串,因此尾随空格很重要。

SELECT 'this' LIKE 'this '返回FALSE。

使用默认排序规则,=LIKE都可能不区分大小写。如果需要以区分大小写的方式比较它们,请使用COLLATE子句指定排序规则。

答案 1 :(得分:2)

你可以对具有空格的表字段运行空查询吗?

RTRIM(str) 
  

返回带尾随的字符串str   空格字符已删除。 MySQL的>   SELECT RTRIM('barbar');            - > 'barbar'此函数是多字节安全的。

答案 2 :(得分:0)

数据库排序规则在其中起着重要的作用。我遇到了类似的情况,发现字符集= utf8mb4和排序规则= utf8mb4_0900_as_cs解决了这个问题。

您可以阅读更多here.

答案 3 :(得分:0)

这很古老,但是您也可以使用binary关键字。

mysql> select 'hello'='hello  ', binary 'hello'='hello  ';
+-------------------+--------------------------+
| 'hello'='hello  ' | binary 'hello'='hello  ' |
+-------------------+--------------------------+
|                 1 |                        0 |
+-------------------+--------------------------+
1 row in set (0.00 sec)

这还将使搜索区分大小写。

mysql> select 'hello'='HELLO', binary 'hello'='HELLO';
+-----------------+------------------------+
| 'hello'='HELLO' | binary 'hello'='HELLO' |
+-----------------+------------------------+
|               1 |                      0 |
+-----------------+------------------------+