簡體   English   中英

比較需要考慮varchar中的尾隨空格

[英]Trailing whitespace in varchar needs to be considered in comparison

我正在使用帶有 varchar 列的表。 我沒有意識到在比較中不考慮尾隨空格(顯然,兩個僅尾隨空格數量不同的值將違反唯一性屬性,如果指定)。

我需要在桌子上解決這個問題,最好是到位。 在 MySQL 中是否有修復這樣的表的推薦路徑?

我嚴格通過我控制的程序訪問數據庫,因此切換到非人類可讀的格式(如二進制)會很好。 但我不確定如何做這樣的事情,也不想破壞桌子。

我必須假設您使用的是 MySQL 5.x,因為 MySQL 4.x 不在 VARCHAR 列中存儲尾隨空格。

正如您所指出的,在 MySQL 中使用標准=運算符,不考慮尾隨空格:

SELECT 'this' = 'this '返回 TRUE

但是, LIKE逐個字符地比較字符串,因此尾隨空格很重要。

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

=LIKE都可以不區分大小寫,使用默認排序規則。 如果需要以區分大小寫的方式比較它們,請使用COLLATE子句指定排序規則。

你能在有空格的表字段上運行空查詢嗎?

RTRIM(str) 

返回刪除了尾隨空格字符的字符串 str。 mysql> SELECT RTRIM('barbar'); -> 'barbar' 這個函數是多字節安全的。

數據庫整理在這方面起着重要作用。 我遇到了類似的情況,並發現 character set = utf8mb4 和 collat​​ion = utf8mb4_0900_as_cs 解決了這個問題。

你可以在這里閱讀更多

這是古老的,但您也可以使用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 |
+-----------------+------------------------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM