以前都是使用Linux平台下的MySQL,現在為了調試方便,在開發機上安裝了MySQL的Windows版本5.6.10,在使用Entity Framework Code First生成數據庫對象時,發現所有的數據表的表名都變成了小寫字符,而字段的名稱是混合大小寫的,這個問題在Linux平台上沒有出現過,於是着手弄明白這是腫么一回事。
經過網上搜索,找到這篇文章:
Entity Framework with mysql, Table Capitalization issue between linux and windows
大致的意思是說:這個問題產生的根源是操作系統,MySQL保存數據表到文件,最初MySQL是在Linux平台開發的,文件名和數據表名稱都是大小寫敏感的,因為絕大多數的Linux文件系統是大小寫敏感的。
后來,MySQL推出Windows平台的版本,而Windows平台是大小寫不敏感的,所以無法區分大小寫的名稱。為了解決這個問題,需要添加設置來忽略表名的大小寫。於是建立了lower_case_table_names設置選項。在Windows平台可以在my.ini文件中設置,該文件在Windows7或Windows2008操作系統中位於 C:\ProgramData\MySQL\MySQL Server 5.6 目錄下。在Linux平台可以修改my.cnf中的設置項。
缺省的選項--
Linux平台:大小寫敏感 Case-Sensitive
Windows平台:大小寫不敏感 Case-Insenstitive
問題的原因找到啦,我們可以在Linux中設置lower_case_table_names為1啟用大小寫不敏感。也可以設置MySQL在Windows中大小寫敏感,但是這不是個好主意。
記住,更改設置后需要重啟MySQL服務。
在Linux中最好使用大小寫敏感的設置,會獲得更高的性能。在Windows平台最好使用大小寫不敏感的設置,因為不能存在兩個僅有大小寫差異而文件名字母相同的表。
由此而生,這也是為什么Linux下MySQL的性能會好過Windows下的原因。(其他原因有:更好的計划調度更快的磁盤IO和文件系統)
也可以在創建數據庫時使用下面的語句來指定大小寫敏感設置:
CREATE DATABASE test_database CHARACTER SET utf8 COLLATE utf8_general_cs; //實測:這一句不能在Windows平台下的MySQL使用; CREATE DATABASE test_database CHARACTER SET utf8 COLLATE utf8_general_ci;
相應的,也可以為某一個數據表設置大小寫敏感:
DROP TABLE IF EXISTS single_test_table; CREATE TABLE single_test_table( single_test_id int unsigned NOT NULL auto_increment, ... PRIMARY KEY PK_single_test_id (single_test_id ), ... ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE utf8_general_cs;
官方文檔5.6.10中指出:
If you are using InnoDB tables, you should set this variable to 1 on all platforms to force names to be converted to lowercase.
如果使用InnoDB引擎,應該在所有的平台設置lower_case_table_names=1強制名稱都轉換為小寫。
[mysqld] lower_case_table_names=1
如果要使Windows平台下的MySQL和Linux平台下的MySQL協同工作,你需要設置Linux平台下的全局變量lower_case_table_names=1,強制將數據表名稱轉換為小寫(大小寫不敏感)。
后記:
如果在Windows平台下設置了lower_case_table_names=0,意味着開啟大小寫敏感,這時Entity Framework Code First初始化數據庫創建的表名是大小寫混合的,可是在執行SQL語句查詢時,SQL表名仍然是大小寫不敏感的。
Entity Framework Code First初始化數據庫創建了一個表:testdb.AppUsers,在Workbench中執行一個SQL語句,使用小寫的數據表名(如果用testdb.AppUsers就不會出問題),例如SELECT * FROM testdb.appusers,不關查詢窗口,然后嘗試刪除數據庫:DROP DATABASE testdb,數據庫無法正確的刪除,會在testdb目錄下留下一個文件:appusers.idb,而且MySQL服務也無法停掉,強制重啟系統也無濟於事,最后只能卸載MySQL數據庫軟件,刪除數據目錄,然后重新安裝。
又經過反復交叉試驗(這要感謝VMWare Fusion的Snapshot功能),Windows平台下去掉lower_case_table_names=0,就不會有上述問題,得出結論:不要玩火!不能在Windows平台下啟用大小寫敏感!