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

步履不停
發布: 2019-06-19 13:30:37
原創
7976 人瀏覽過

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

#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)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的配置保持一致,這樣防止因為環境不一致而出現一些詭異問題。

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

更多MySQL相關技術文章,請造訪MySQL教學##欄位學習!

以上是MySQL儲存的欄位是不區分大小寫的,你知道嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!