共計 1541 個字符,預計需要花費 4 分鐘才能閱讀完成。
這篇文章主要介紹如何解決 Mysql 數據庫中 sql 語句的 where 條件中文本匹配問題,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
Mysql 數據庫中 sql 語句中 where 條件中文本匹配問題
問題描述
字段 name 類型為 varchar 時(CHAR,VARCHAR 和 TEXT 情況都一樣),
語句一
select * from aaa where name= a
語句二
select * from aaa where name= a
結果一樣:不能區分末尾是否有空格,
建議:
1、如果必須精確匹配(包括大小寫和末尾空格)建議轉換成二進制比較,使用 select * from aaa where name=BINARY a
2、如果需要精確校驗末尾是否有空格,但是保留大小寫模糊匹配 (默認校對規則_ci 大小寫不敏感),建議增加 length(name) 就可以比較出長度來區分
3、如果需要精確校驗大小寫,但是保留末尾空格忽略,可以使用 select * from aaa where name= a collate utf8_cs; (字符為 utf8)
4、默認設置情況下,
a、where name= a
b、where name= a(末尾有空格)
c、where name= A
b、where name= A (末尾有空格)
四中情況匹配的結果是一樣的,
經查詢官方文檔:
所有 MySQL 歸類都是 PAD SPACE 類型。這意味著所有 CHAR,VARCHAR 和 TEXT 值都會進行比較,而不考慮任何尾隨空格。在此上下文中的“比較”不包括 LIKE 模式匹配運算符,其尾部空格是重要的。例如:
mysql CREATE TABLE names (myname CHAR(10));
Query OK, 0 rows affected (0.03 sec)
mysql INSERT INTO names VALUES (Monty
Query OK, 1 row affected (0.00 sec)
mysql SELECT myname = Monty , myname = Monty FROM names; +——————+——————–+
| myname = Monty | myname = Monty |
+——————+——————–+
| 1 | 1 |
+——————+——————–+
1 row in set (0.00 sec)
mysql SELECT myname LIKE Monty , myname LIKE Monty FROM names; +———————+———————–+ |
myname LIKE Monty | myname LIKE Monty |
+———————+———————–+
| 1 | 0 |
+———————+———————–+
1 row in set (0.00 sec)
對于所有 MySQL 版本都是如此,并且不受服務器 SQL 模式的影響。
注意
有關 MySQL 字符集和歸類的更多信息,請參閱第 10 章,字符集,歸類,Unicode。有關存儲要求的更多信息,請參見第 11.7 節“數據類型存儲要求”。
對于尾隨填充字符被去除或比較忽略它們的情況,如果列的索引需要唯一值,則插入到僅與尾部填充字符數不同的列值中將導致重復鍵錯誤。
例如,如果一個表包含 a,則嘗試存儲 a 會導致重復鍵錯誤。
以上是“如何解決 Mysql 數據庫中 sql 語句的 where 條件中文本匹配問題”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注丸趣 TV 行業資訊頻道!