我正在使用带varchar列的表。我没有意识到在比较中没有考虑尾随空格(显然,两个仅在尾随空格量方面不同的值将违反唯一性属性,如果指定的话)。
我需要在表格中修复此问题,最好是在适当的位置。是否有推荐的路径在MySQL中修复这样的表?
我正在通过我控制的程序严格访问数据库,因此切换到非人类可读的格式(如二进制文件)就可以了。但我不知道怎么做这样的事情,也不想破坏这张桌子。
答案 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 |
+-----------------+------------------------+