numeric比较大小 数据库_mysql大小写敏感与校对规则
正文
大家在使用mysql過程中,可能會遇到類似以下的問題:
模糊匹配 jg%,結果以JG開頭的字符串也出現(xiàn)在結果集中,大家很自然的認為是大小寫敏感的問題。那么mysql中大小寫敏感是如何控制的;數(shù)據(jù)庫名,表名,字段名這些字典對象以及字段值的大小敏感是如何控制的;以及校驗規(guī)則與索引的關系,這是本文要討論的內容。
數(shù)據(jù)庫名、表名:
windows建庫:
windows建表:
linux建庫:
linux建表:
以上可以看出windows下大小寫不敏感,linux下是敏感的,故前者不可以同時建test和TEST,而后者可以。
大小寫區(qū)分規(guī)則:
Linux下:
- 數(shù)據(jù)庫名與表名是嚴格區(qū)分大小寫的;
- 表的別名是嚴格區(qū)分大小寫的;
- 列名與列的別名在所有的情況下均是忽略大小寫的;
- 變量名也是嚴格區(qū)分大小寫的;
Windows下:
- 都不區(qū)分大小寫。
Mac OS下,文件系統(tǒng)類型HFS+,非UFS卷:
- 都不區(qū)分大小寫。
mysql中控制數(shù)據(jù)庫名和表名的大小寫敏感由參數(shù)lowercasetable_names控制,為0時表示區(qū)分大小寫,為1時,表示將名字轉化為小寫后存儲,不區(qū)分大小寫。
在mysql中,數(shù)據(jù)庫對應數(shù)據(jù)目錄中的目錄。數(shù)據(jù)庫中的每個表至少對應數(shù)據(jù)庫目錄中的一個文件(也可能是多個,取決于存儲引擎)。因此,所使用操作系統(tǒng)的大小寫敏感性決定了數(shù)據(jù)庫名和表名的大小寫敏感性。
lowercasefile_system:
變量說明是否數(shù)據(jù)目錄所在的文件系統(tǒng)對文件名的大小寫敏感。ON說明對文件名的大小寫不敏感,OFF表示敏感。
lowercasetable_names:
unix下默認值為 0 ;Windows下默認值是 1 ;Mac OS X下默認值是 2
*0:*使用CREATE TABLE或CREATE DATABASE語句指定的大小寫字母在硬盤上保存表名和數(shù)據(jù)庫名。名稱比較對大小寫敏感。在大小寫不敏感的操作系統(tǒng)如windows或Mac OS x上我們不能將該參數(shù)設為0,如果在大小寫不敏感的文件系統(tǒng)上將此參數(shù)強制設為0,并且使用不同的大小寫訪問MyISAM表名,可能會導致索引破壞。
*1:*表名在硬盤上以小寫保存,名稱比較對大小寫不敏感。MySQL將所有表名轉換為小寫在存儲和查找表上。該行為也適合數(shù)據(jù)庫名和表的別名。該值為Windows的默認值。
*2:*表名和數(shù)據(jù)庫名在硬盤上使用CREATE TABLE或CREATE DATABASE語句指定的大小寫字母進行保存,但MySQL將它們轉換為小寫在查找表上。名稱比較對大小寫不敏感,即按照大小寫來保存,按照小寫來比較。注釋:只在對大小寫不敏感的文件系統(tǒng)上適用innodb表名用小寫保存。
windows上:
linux上:
為了避免大小寫引發(fā)的問題,一種推薦的命名規(guī)則是:在定義數(shù)據(jù)庫、表、列的時候全部采用小寫字母加下劃線的方式,不使用任何大寫字母。
字段名和字段值:
字段名通常都是不區(qū)分大小寫的。
字段值的大小寫由mysql的校對規(guī)則來控制。提到校對規(guī)則,就不得不說字符集。字符集是一套符號和編碼,校對規(guī)則是在字符集內用于比較字符的一套規(guī)則,比如定義'A'<'B'這樣的關系的規(guī)則。不同的字符集有多種校對規(guī)則,一般而言,校對規(guī)則以其相關的字符集名開始,通常包括一個語言名,并且以ci(大小寫不敏感)、cs(大小寫敏感)或bin(二元)結束 。比如 utf8字符集,utf8generalci,表示不區(qū)分大小寫,這個是utf8字符集默認的校對規(guī)則;utf8generalcs表示區(qū)分大小寫,utf8bin表示二進制比較,同樣也區(qū)分大小寫。
校對規(guī)則通過關鍵字collate指定,比如創(chuàng)建數(shù)據(jù)庫test2,指定字符集為utf8,校對規(guī)則為utf8_bin
create database test2 default character set utf8 collate utf8_bin;通過上述語句說明數(shù)據(jù)庫test2中的數(shù)據(jù)按utf8編碼,并且是對大小寫敏感的。
有時候我們建庫時,沒有指定校對規(guī)則校對時字符大小寫敏感,但是我們查詢時,又需要對字符比較大小寫敏感,就比如開篇中的例子,只想要jg開頭的字符串。沒關系,mysql提供了collate語法,通過指定utf8_bin校對規(guī)則即可。
還有另外一種方法,通過binary關鍵字,將串轉為二進制進行比較,由于大小寫字符的二進制肯定不同,因此可以認為是區(qū)分大小的一種方式。
校對規(guī)則與索引存儲的關系。因為校對規(guī)則會用于字符串之間比較,而索引是基于比較有序排列的,因此校對規(guī)則會影響記錄的索引順序。下面舉一個小例子說明:
建表: create table test3(name varchar(100), primary key(name)); create table test4(name varchar(100), primary key(name)) collate utf8_bin; 給表test3插入數(shù)據(jù): insert into test3(name) values('abc'); insert into test3(name) values('ABD'); insert into test3(name) values('ZBC');給表test4插入數(shù)據(jù): insert into test4(name) values('abc'); insert into test4(name) values('ABD'); insert into test4(name) values('ZBC');查表: select * from test3; select * from test4;從結果可以看到test3和test4返回的結果集中,記錄的相對順序是不同的,因為是全表掃描,返回的記錄體現(xiàn)了主鍵順序。由于test3表校驗規(guī)則采用默認的utf8generalci,大小寫不敏感,因此abc
關于mysql相關海量教程可以關注文末公眾號回復【1】加助手微信索取。
本公眾號免費提供csdn下載服務,海量IT學習資源如果你準備入IT坑,勵志成為優(yōu)秀的程序猿,那么這些資源很適合你,包括但不限于java、go、python、springcloud、elk、嵌入式 、大數(shù)據(jù)、面試資料、前端 等資源。同時我們組建了一個技術交流群,里面有很多大佬,會不定時分享技術文章,如果你想來一起學習提高,可以公眾號后臺回復【2】,免費邀請加技術交流群互相學習提高,會不定期分享編程IT相關資源。
掃碼關注,精彩內容第一時間推給你
總結
以上是生活随笔為你收集整理的numeric比较大小 数据库_mysql大小写敏感与校对规则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fiddler不能抓取浏览器数据_抓包软
- 下一篇: flex 换主轴后子元素占满_Flex布