mysql大小寫敏感與校對規則

2022-09-15 23:03:26 字數 2093 閱讀 7699

大家在使用mysql過程中,可能會遇到類似一下的問題:

root@chuck 07:42:00>select * from test where c1 like 'ab%'; 

+-----+ 

| c1 | 

+-----+ 

| abc | 

| abd | 

+-----+

模糊匹配 ab%,結果以ab開頭的字串也出現在結果集中,大家很自然的認為是大小寫敏感的問題。那麼mysql中大小寫敏感是如何控制的;資料庫名,表名,欄位名這些字典物件以及字段值的大小敏感是如何控制的;以及校驗規則與索引的關係,這是本文要討論的內容。

mysql中控制資料庫名和表名的大小寫敏感由引數lower_case_table_names控制,為0時表示區分大小寫,為1時,表示將名字轉化為小寫後儲存,不區分大小寫。欄位名通常都是不區分大小寫的,字段值呢?字段值的大小寫由mysql的校對規則來控制。提到校對規則,就不得不說字符集。字符集是一套符號和編碼,校對規則是在字符集內用於比較字元的一套規則,比如定義'a'<'b'這樣的關係的規則。不同的字符集有多種校對規則,一般而言,校對規則以其相關的字符集名開始,通常包括乙個語言名,並且以_ci(大小寫不敏感)、_cs(大小寫敏感)或_bin(二元)結束 。比如 utf8字符集,utf8_general_ci,表示不區分大小寫,這個是utf8字符集預設的校對規則;utf8_general_cs表示區分大小寫,utf8_bin表示二進位制比較,同樣也區分大小寫。

校對規則通過關鍵字collate指定,比如建立資料庫d1,指定字符集為utf8,校對規則為utf8_bin

create database d1 default character set utf8  collate utf8_bin;

通過上述語句說明資料庫d1中的資料按utf8編碼,並且是對大小寫敏感的。有時候我們建庫時,沒有指定校對規則校對時字元大小寫敏感,但是我們查詢時,又需要對字元比較大小寫敏感,就比如開篇中的例子,只想要ab打頭的字串。沒關係,mysql提供了collate語法,通過指定utf8_bin校對規則即可。

root@chuck 08:19:35>select * from test where c1 like 'ab%' collate utf8_bin; 

+-----+ 

| c1 | 

+-----+ 

| abc| 

+-----+

這裡還有另外一種方法,通過binary關鍵字,將串轉為二進位制進行比較,由於大小寫字元的二進位制肯定不同,因此可以認為是區分大小的一種方式。

root@chuck 07:50:35>select * from test where binary c1 like 'ab%'; 

+-----+ 

| c1 | 

+-----+ 

| abc | 

+-----+

最後要說明一點的是校對規則與索引儲存的關係。因為校對規則會用於字串之間比較,而索引是基於比較有序排列的,因此校對規則會影響記錄的索引順序。下面舉乙個小例子說明:1建表

create table test(c1 varchar(100), primary key(c1));

create table test2(c1 varchar(100), primary key(c1)) collate utf8_bin;

2初始化資料

insert into test(c1) values('abc');

insert into test(c1) values('abd');

insert into test(c1) values('zbc');3查詢

select * from test;

select * from test2;4返回

結果集| abc | 

| abd | 

| zbc | 

| abd | 

| zbc | 

| abc | 

表1從表1可以看到test和test2返回的結果集中,記錄的相對順序是不同的,因為是全表掃瞄,返回的記錄體現了主鍵順序。由於test表校驗規則採用預設的utf8_general_ci,大小寫不敏感,因此abc

MySQL大小寫敏感

mysql大小寫敏感的解決方案 注 關於lower case table names引數對錶名稱或資料庫名稱大小寫敏感的控制。unix下預設為0,也就是大小寫敏感的 windows下預設為1,不敏感 macos預設為2,儲存區分大小寫,但是在查詢時會轉換為小寫。對於在大小寫不敏感的系統 window...

mysql 區分大小寫 大小寫敏感 配置

linux下mysql預設區分大小寫 windows下mysql預設不區分大小寫 檢視是否區分大小寫 lower case table names引數詳解 lower case table names 0 其中 0 區分大小寫,1 不區分大小寫 mysql在linux下資料庫名 表名 列名 別名大小...

PHP命名大小寫敏感規則

一直覺得php中各種大小寫規則理不清,就連工作多年的老手們也不一定能對php大小寫敏感問題足夠了解。在php中,大小寫敏感問題的處理比較亂,大家一定要注意。即使某些地方大小寫不敏感,但在程式設計過程中能始終堅持 大小寫敏感 是最好不過的。下面整理了一些大小寫問題注意點 大小寫敏感 1.變數名區分大小...