作一個積極的人php
編碼、改bug、提高本身html
我有一個樂園,面向編程,春暖花開!mysql
以前寫過一篇關於mysql 對錶大小寫敏感的問題,其實在mysql中字段存儲的內容是不區分大小寫的,本篇進行簡單的總結。sql
想回顧一下:數據庫
MySQL在Linux下數據庫名、表名、列名、別名大小寫規則是這樣的:編程
一、數據庫名與表名是嚴格區分大小寫的;服務器
二、表的別名是嚴格區分大小寫的;ui
三、列名與列的別名在全部的狀況下均是忽略大小寫的;編碼
四、字段內容默認狀況下是大小寫不敏感的。spa
簡單例子:
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
複製代碼
經過這個例子簡單說明,字段內容默認狀況下是大小寫不敏感的。
**由於默認狀況下字段內容是不區分大小寫的,也即大小寫不敏感。**因此解決方案就是要新增字段內容的校驗規則。
使用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
。
字段值的大小寫由mysql的校對規則來控制。提到校對規則,就不得不說字符集。字符集是一套符號和編碼,校對規則是在字符集內用於比較字符的一套規則。 通常而言,校對規則以其相關的字符集名開始,一般包括一個語言名,而且以_ci(大小寫不敏感)、_cs(大小寫敏感)或_bin(二元)結束 。
好比 utf8字符集,,以下表:
1)utf8_bin:utf8_bin將字符串中的每個字符用二進制數據存儲,區分大小寫。
2)utf8_general_ci:utf8_genera_ci不區分大小寫,ci爲case insensitive的縮寫,即大小寫不敏感。
3)utf8_general_cs:utf8_general_cs區分大小寫,cs爲case sensitive的縮寫,即大小寫敏感。
注:我本機使用5.7 版本不支持 utf8_general_cs 字符集,建立報錯。
經過上一篇和這一篇的內容,詳細你們對mysql對大小寫敏感的問題也有必定的認識了,在實際的開發中,庫和表名最好使用小寫字母,注意字段存儲內容的大寫問題。而且讓本地開發環境mysql的配置和服務器上mysql的配置保持一致,這樣防止由於環境不一致而出現一些詭異問題。
你在開發中有沒有遇到一些詭異的問題呢?歡迎留言分享。
www.techonthenet.com/mysql/funct…
謝謝你的閱讀,若是您以爲這篇博文對你有幫助,請點贊或者喜歡,讓更多的人看到!祝你天天開心愉快!
無論作什麼,只要堅持下去就會看到不同!在路上,不卑不亢!
願你我在人生的路上能都變成最好的本身,可以成爲一個獨擋一面的人
© 天天都在變得更好的阿飛雲