1.MySQL大小寫敏感規則 MySQL中,一個庫會對應一個文件夾,庫里的表會則以文件的方式存放在文件夾內,所以,操作系統對大小寫的敏感性決定了數據庫和表的大小寫敏感(MySQL有一個只讀的系統變量lower_case_file_system,其值反映的正是當前文件系統是否區分大小寫)因此:在Windows下Mysql的數據庫和表名是大小寫不敏感的,而在大多數類型的Unix系統中是大小寫敏感的。 以下是MySQL詳細的大小寫區分規則: 在Linux下: 1、數據庫名與表名是嚴格區分大小寫的; 2、表的別名是嚴格區分大小寫的; 3、列名與列的別名在所有的情況下均是忽略大小寫的; 4、變量名也是嚴格區分大小寫的; 在Windows下: 全部不區分大小寫 補充: 1.MySQL中有一個系統變量:lower_case_table_names,專門用來配置是否區分據庫名與表名的大小寫。 如果你的系統是Windows,而你又希望mysql能夠區分大小寫,那么你可以在my.ini文件中,在[mysqld]一節的最后,加入如下部分: [plain] view plain copy #If set to 0, table names are stored as specified and comparisons are case sensitive. #If set to 1, table names are stored in lowercase on disk and comparisons are not case sensitive. #If set to 2, table names are stored as given but compared in lowercase. This option also applies to database names and table aliases. lower_case_table_names=0 2.MySQL在查詢字符串時是大小寫不敏感的。如某字段值需要區分大小寫,可在定義該字段時指定BINARY屬性。 2.一種MySQL命名規范 為了避免大小寫引發的問題,一種推薦的命名規則是:在定義數據庫、表、列的時候全部采用小寫字母加下劃線的方式,不使用任何大寫字母。 3.關于Hibernate/JPA數據庫schema自動映射的問題 使用Hibernate/JPA的工程可以自動生成數據庫的schema,由于java有著自己的類與字段命名規則,這與mysql推薦的命名規則不太相符,于是出現了follow哪一種命名規范的問題。一般來說這會由團隊和DBA協商確定,使用mysql的命名規范不會出現大小寫帶來的問題,對于DBA來說可能也更加友好,而使用java的命名規范則對開發人員來說無疑是更加友好的,這將省去列名的映射配置,同時也方便開發人員查看數據庫。如果你的項目使用了后者,你最好像上面講到的,設置一下lower_case_table_names=0。 MySQL語句中字母大小寫規則隨著語句元素的不同而變化,同時還要取決于MySQL服務器主機上的操作系統。 SQL關鍵字與函數名 關鍵字和函數名不區分字母的大小寫。如、abs、bin、now、version、floor等函數、SELECT、WHERE、ORDER、GROUP BY等關鍵字。 MySQL中大小寫問題 數據庫、數據表和視圖的名字 在服務器主機上,MySQL數據庫和數據表用底層文件系統中的目錄和文件表示。因此數據庫和數據表名字的默認字母大小寫情況取決于服務器主機上的操作系統在文件名方面的規定。Windows文件名不區分字母的大小寫,所以運行在windows主機上的MySQL服務器就不區分數據庫和數據表名字的字母大小寫。運行在Unix/Linux主機上的MySQL服務器區分數據庫和數據表名字的大小寫。 MySQL中使用一個文件來表示一個試圖,所以視圖也符合上述規則。 存儲程序的名字 存儲函數、存儲過程、事件的名字不區分字母的大小寫。觸發器的名字要區分字母的大小寫。 數據列和索引的名字 數據列和索引的名字在MySQL環境里不區分字母的大小寫。實例如下: MySQL的大小寫問題 不是一個很大的問題,但是如果不了解的話,卻會使用戶產生迷惑 ;如下面 Sql代碼 insert into t values('A'); insert into t values('a'); 當第二條執行的時候,如果是主鍵或者有唯一性約束的話,會發生 Sql代碼 Duplicate entry for XXX 更加迷惑的是下面的2條語句 Java代碼 insert into t values('~'); insert into t values('y'); 也會發生插入錯誤。 在查詢的時候也會出現這樣的問題 Java代碼 /* 查詢的結果一眼 */ select * from t where a like 'a%' select * from t where a like 'A%' /* 下面的查詢結果也是一樣 */ select * from t where a = 'y'; select * from t where a = ''~; 1.問題產生的原因 MySQL在Linux下數據庫名、表名、列名、別名大小寫規則是這樣的: 1、數據庫名與表名是嚴格區分大小寫的; 2、表的別名是嚴格區分大小寫的; 3、列名與列的別名在所有的情況下均是忽略大小寫的; 4、變量名也是嚴格區分大小寫的; MySQL在Windows下都不區分大小寫。 MySQL在查詢字符串時是大小寫不敏感的,在編繹MySQL時一般以ISO-8859字符集作為默認的字符集,這個字符集對大小寫不敏感,因此在比較過程中中文編碼字符大小寫轉換造成了這種現象。 2.解決辦法 A.表名區分大小寫 在my.conf加入: ower_case_table_names = 0 其中 0:區分大小寫,1:不區分大小寫 B.插入查詢時區分大小寫 字段值需要設置BINARY屬性,即可區分大小寫。 設置的方法有多種: 創建時設置: CREATE TABLE T( A VARCHAR(10) BINARY ); 使用alter修改: ALTER TABLE `tablename` MODIFY COLUMN `cloname` VARCHAR(45) BINARY; mysql table editor中直接勾選BINARY項。 MySQL字符串大小寫經常會讓我們在注冊網站時受困了注冊名的大小寫,出現這個問題的原因是:MySQL在查詢字符串時是大小寫不敏感的,在編繹MySQL時一般以ISO-8859字符集作為默認的字符集,這個字符集對MySQL字符串大小寫不敏感,因此在比較過程中中文編碼字符大小寫轉換造成了這種MySQL字符串大小寫的問題。 方法一: 解決方法是對于包含中文的字段加上"binary"屬性,使之作為二進制比較,例如將"name char(10)"改成"name char(10)binary"。 方法二: 如果你使用源碼編譯MySQL,可以編譯MySQL時使用--with--charset=gbk 參數,這樣MySQL就會直接支持中文查找和排序了。 方法三: 可以使用 Mysql 的 locate 函數來判斷。以上述問題為例,使用方法為: SELECT * FROM table WHERE locate(field,'李') > 0; 方法四: 把您的Select語句改成這樣,SELECT * FROM TABLE WHERE FIELDS LIKE BINARY '%FIND%'即可! 方法五: 如果你在Windows下使用已經編譯好的MySQL,可以修改My.ini中的字符集選項。 default-character-set = gb2312 如果是自己的服務器使用win系統,方法五是最好的方法!如果是linux系統,可以使用方法二!如果不是自己的機子,可以使用方法一,這樣你的用戶名是嚴格區分大小寫的! |
免責聲明:本站部分文章和圖片均來自用戶投稿和網絡收集,旨在傳播知識,文章和圖片版權歸原作者及原出處所有,僅供學習與參考,請勿用于商業用途,如果損害了您的權利,請聯系我們及時修正或刪除。謝謝!
始終以前瞻性的眼光聚焦站長、創業、互聯網等領域,為您提供最新最全的互聯網資訊,幫助站長轉型升級,為互聯網創業者提供更加優質的創業信息和品牌營銷服務,與站長一起進步!讓互聯網創業者不再孤獨!
掃一掃,關注站長網微信