繁体   English   中英

MySQL 5.5在查询中丢失尾随空格

[英]MySQL 5.5 losing trailing spaces in query

我正在构建一个数据库,其中尾随空格对结果很重要。 当我查询结果时,我发现了

SELECT * where `field` = 'a ' 

当存在值为'a'的字段时返回结果。 我希望结尾空间在结果集中很重要。 我尝试过使用Char,Varchar,Text和Blob。 我会注意到这个字段是我的表的索引。

有人能告诉我如何以一种使尾随(和/或前导)空间计数的方式进行查询吗? 我是否需要以任何特殊方式格式化我的表格以使其工作?

此行为是设计使然,不仅在MySQL中。

您可以使用BINARY比较中解决它:

mysql> select version(), 'a' = 'a ', BINARY 'a' = BINARY 'a ';
+-------------+------------+--------------------------+
| version()   | 'a' = 'a ' | BINARY 'a' = BINARY 'a ' |
+-------------+------------+--------------------------+
| 5.5.25a-log |          1 |                        0 |
+-------------+------------+--------------------------+
1 row in set (0.00 sec)

但不多。 如果空格出现在例如搜索的用户输入中,这将帮助您使用SELECT ; 但是如果你想要实际输入空白跟踪信息,那么这将是一个问题(你不能拥有同时包含'a'和'a'的索引)。

也可以看看

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

您可以想象地反转该列中的字符串,并在显示它们时将其反转。 当然,这将破坏基于该列的任何排序,但如果您只测试相等或子串存在,它可能会起作用。 领先的空间确实很重要

对于相等搜索,您还可以存储字符串的base64编码,该编码应该保持字典顺序(即,a和b之间的顺序应该保持在base64(a)和base64(b)之间)。 或者你可以在字符串上附加一个终结符(“\\ n”可以做得很好而不会出现在搜索中)。

最后,但它有风险因为人类无法区分,你可以用UTF8 char替换空格(49824):

mysql> select concat ('\'a', char(49824),'\'') AS tricked,
              concat ('\'a', ' '        ,'\'') as honest,
              concat ('\'a', char(49824),'\'') =
              concat ('\'a', ' '        ,'\'') as equals;

+---------+--------+--------+
| tricked | honest | equals |
+---------+--------+--------+
| 'a '    | 'a '   |      0 |
+---------+--------+--------+
1 row in set (0.00 sec)

似乎相等,但它们不是。 请注意,在HTML中,空格是一个空格,而49824是  (不间断的空间)。 这会影响转换为HTML的函数,而实际上是UTF8代码点意味着诚实字符串是两个字节,但欺骗字符串的长度实际上是三个

最后,您可以声明列VARBINARY而不是VARCHAR ,从而完全隐藏正在发生的事情。 它看起来是最简单的解决方案,但我担心这可能会让你感到困扰几周或几个月。

我已经成功地完成了以下工作,但我不确定它是否是一种不稳定的方法。

CREATE TEMPORARY TABLE test (
  PRIMARY KEY(id),
  id INT AUTO_INCREMENT,
  val VARCHAR(20)
);

INSERT INTO test VALUES
(NULL, 'a'),
(NULL, 'a '),
(NULL, 'a  '),
(NULL, 'a   ');

SELECT * FROM test
WHERE val LIKE 'a ';

产量

id  val
2   'a '

使用WHERE val ='a'将选择所有条目而不考虑尾随空格,但LIKE适用于我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM