MySQL & Entity Framework Code First 數據表大小寫的問題


以前都是使用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平台下啟用大小寫敏感!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM