MySQL存儲的字段是不區分大小寫的,你知道嗎?


在這里插入圖片描述

做一個積極的人

編碼、改bug、提升自己

我有一個樂園,面向編程,春暖花開!

00 簡單回顧

之前寫過一篇關於mysql 對表大小寫敏感的問題,其實在mysql中字段存儲的內容是不區分大小寫的,本篇進行簡單的總結。

想回顧一下:

MySQL在Linux下數據庫名、表名、列名、別名大小寫規則是這樣的:

1、數據庫名與表名是嚴格區分大小寫的;

2、表的別名是嚴格區分大小寫的;

3、列名與列的別名在所有的情況下均是忽略大小寫的;

4、字段內容默認情況下是大小寫不敏感的。

01 一個例子

簡單例子:

CREATE TABLE `tb_user` ( `id` BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用戶id', `username` VARCHAR (50) NOT NULL COMMENT '用戶名', PRIMARY KEY (`id`) ) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '用戶表'; INSERT INTO `u2s`.`tb_user` (`id`, `username`) VALUES ('1', 'user'); INSERT INTO `u2s`.`tb_user` (`id`, `username`) VALUES ('2', 'User'); INSERT INTO `u2s`.`tb_user` (`id`, `username`) VALUES ('3', 'USER'); 

使用 查詢語句查詢 username 為 全部小寫的user 的用戶,結果查詢出這個三條記錄全部都查詢到了。

mysql> SELECT username from tb_user where username = 'user'; +----------+ | username | +----------+ | user | | User | | USER | +----------+ 3 rows in set 

通過這個例子簡單說明,字段內容默認情況下是大小寫不敏感的。

02 解決方案

因為默認情況下字段內容是不區分大小寫的,也即大小寫不敏感。所以解決方案就是要新增字段內容的校驗規則。

使用mysql 的BINARY 關鍵字使搜索區分大小寫。

在查詢的sql中加入BINARY 關鍵字

mysql> select * from tb_user where BINARY username ='user'; +----+----------+ | id | username | +----+----------+ | 1 | user | +----+----------+ 1 row in set 

這種方式相對較簡單,不用改動表結構,只需在需要區分查詢的字段前加上關鍵字。這種方式也是有缺點的,每次寫查詢的時候都要注意加關鍵字,並可能需要改動的代碼較多。

在創建表的時候進行限制

CREATE TABLE `tb_user1` ( `id` BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用戶id', `username` VARCHAR (50) BINARY NOT NULL COMMENT '用戶名', PRIMARY KEY (`id`) ) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '用戶表'; mysql> show create table tb_user1; tb_user1 | CREATE TABLE `tb_user1` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用戶id', `username` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '用戶名', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶表' 1 row in set 

或者 使用

CREATE TABLE `tb_user2` ( `id` BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用戶id', `username` VARCHAR (50) NOT NULL COMMENT '用戶名', `info` VARCHAR (100) NOT NULL COMMENT '詳情描述', PRIMARY KEY (`id`) ) ENGINE = INNODB DEFAULT CHARSET = utf8 COLLATE=utf8_bin COMMENT = '用戶表'; mysql> show create table tb_user2; tb_user2 | CREATE TABLE `tb_user2` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用戶id', `username` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '用戶名', `info` varchar(100) COLLATE utf8_bin NOT NULL COMMENT '詳情描述', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用戶表' 

使用 NGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin會將字段中varchar類型的全部設置區分大小寫。這兩種查看表的詳情,本質上都是 在字段上 加上了 COLLATE utf8_bin

03 總結

字段值的大小寫由mysql的校對規則來控制。提到校對規則,就不得不說字符集。字符集是一套符號和編碼,校對規則是在字符集內用於比較字符的一套規則。 一般而言,校對規則以其相關的字符集名開始,通常包括一個語言名,並且以ci(大小寫不敏感)、cs(大小寫敏感)或_bin(二元)結束 。

比如 utf8字符集,,如下表:

1)utf8bin:utf8bin將字符串中的每一個字符用二進制數據存儲,區分大小寫。

2)utf8generalci:utf8generaci不區分大小寫,ci為case insensitive的縮寫,即大小寫不敏感。

3)utf8generalcs:utf8generalcs區分大小寫,cs為case sensitive的縮寫,即大小寫敏感。

注:我本機使用5.7 版本不支持 utf8generalcs 字符集,創建報錯。

通過上一篇和這一篇的內容,詳細大家對mysql對大小寫敏感的問題也有一定的認識了,在實際的開發中,庫和表名最好使用小寫字母,注意字段存儲內容的大寫問題。並且讓本地開發環境mysql的配置和服務器上mysql的配置保持一致,這樣防止因為環境不一致而出現一些詭異問題。

你在開發中有沒有遇到一些詭異的問題呢?歡迎留言分享。

04 參考資料

https://dev.mysql.com/doc/search/?d=12&p=1&q=binary

https://www.techonthenet.com/mysql/functions/binary.php

https://www.cnblogs.com/wzmenjoy/p/4244545.html

 

 


謝謝你的閱讀,如果您覺得這篇博文對你有幫助,請點贊或者喜歡,讓更多的人看到!祝你每天開心愉快!


 

不管做什么,只要堅持下去就會看到不一樣!在路上,不卑不亢!

 

願你我在人生的路上能都變成最好的自己,能夠成為一個獨擋一面的人

© 每天都在變得更好的阿飛雲


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM