簡體   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