[英]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'的索引)。
也可以看看
您可以想象地反转该列中的字符串,并在显示它们时将其反转。 当然,这将破坏基于该列的任何排序,但如果您只测试相等或子串存在,它可能会起作用。 领先的空间确实很重要
对于相等搜索,您还可以存储字符串的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.