您好,登錄后才能下訂單哦!
這篇文章主要介紹如何解決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條件中文本匹配問題”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。