MySQL & Entity Framework Code First 資料表大小寫問題

來源:互聯網
上載者:User

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

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.