2012-02-25 76 views
6

問題是我們正在開發Windows機器,並且一旦完成,我們將代碼部署在unix機器上。該代碼在Windows上運行良好,但是在unix中,我們在更改表名後出現錯誤,如'沒有這樣的表存在',正確的情況下它在UNIX中也能正常工作。實際上,在Windows中,默認情況下沒有區分大小寫的表名,但是在unix中它們確實有(讀取MySQL表實際上是文件,而在unix中我們具有區分大小寫的文件名,但不在Windows中)。解決方法可能是再次創建所有表,並讓表名以小寫字母表示。是的,我們也可以這樣做,那很好。如何在MySql中強制區分大小寫的表名和列名?

但是,我們仍然可以在MySql(Windows機器)中的表名上加上區分大小寫。如果是的話,請讓我知道如何做到這一點。

+0

這是一個有趣的問題。導致類似於Windows中的SQL工作而不是基於Unix的系統出現問題。 AFAIK,沒有解決辦法。 – Nishant 2012-02-25 09:34:55

回答

4

在Unix上,lower_case_table_names的默認值爲0.在Windows上,默認值爲1.在Mac OS X上,MySQL 4.0.18之前的默認值爲1,4.0.18的默認值爲2。

要解決此問題,您可以在您的my.ini文件中找到設置:lower_case_table_names,位於或位於:C:\ Program Files \ MySQL \ MySQL Server 4.1中,具體取決於您正在運行的版本。如果你沒有找到設置,你可以將它添加到my.ini文件的結尾,像我一樣,像這樣:

lower_case_table_names=0 

記住你測試是否之前重新啓動MySQL服務有用。

如果您僅在一個平臺上使用MySQL,則通常不必將lower_case_table_names變量從其默認值更改。但是,如果要在文件系統區分大小寫不同的平臺之間傳輸表,可能會遇到困難。例如,在Unix上,可以有兩個名爲my_table和MY_TABLE的表,但在Windows上,這些名稱被認爲是相同的。爲了避免數據庫或表名稱發生數據傳輸問題,您有兩種選擇:

在所有系統上使用lower_case_table_names = 1。這樣做的主要缺點是,當您使用SHOW TABLES或SHOW DATABASES時,您看不到原始信箱中的名稱。

在Unix上使用lower_case_table_names = 0,在Windows上使用lower_case_table_names = 2。這保留了數據庫和表名的字母大小寫。這樣做的缺點是,您必須確保您的語句始終在Windows上使用正確的lettercase引用數據庫和表名。如果你將你的語句轉移到Unix中,那麼lettercase是有意義的,如果這個casecase是不正確的,它們就不起作用。

例外情況:如果您正在使用InnoDB表,並且您試圖避免這些數據傳輸問題,則應在所有平臺上將lower_case_table_names設置爲1以強制名稱轉換爲小寫。

如果您打算在Unix上將lower_case_table_names系統變量設置爲1,則必須先將舊數據庫和表名稱轉換爲小寫,然後再停止mysqld並使用新變量設置重新啓動它。

請查看MySQL的網站有關此的其他信息,以及一些重要的警告http://dev.mysql.com/doc/refman/4.1/en/identifier-case-sensitivity.html

5

設置被稱爲lower_case_table_names。如果將其設置爲0,則比較將區分大小寫。

然而,

如果你有不區分大小寫的文件名(如Windows或Mac OS X)的系統上運行MySQL你不應該將此變量設置爲0。如果在不區分大小寫的文件系統上使用--lower-case-table-names = 0強制將此變量設置爲0,並使用不同的lettercase訪問MyISAM表名,則可能導致索引損壞。

在所有系統(包括Linux)上使所有表名小寫,即。將其設置爲值1,聽起來像是更好的選擇:

表名稱在磁盤上以小寫形式存儲,名稱比較不區分大小寫。 MySQL在存儲和查找時將所有表名稱轉換爲小寫字母。這種行爲也適用於數據庫名稱和表別名。

+0

問題是我可以更改設置在Windows機器,但不是在UNIX系統。通過這個解決方案,如果我有訪問my.ini文件在Unix中我可以改變這個設置爲1,它會解決這個問題。但我想換一種方式。意思,而不是unix中的表不區分大小寫,我想在Windows中的表格區分大小寫。 – 2012-02-25 10:02:51

+0

@Rakesh查看選項'0',但不推薦。我不明白第一個問題是怎麼發生的 - 你不能確保你的代碼使用正確的名字嗎?部署到Linux時,表名在某些時候是否發生了變化? – 2012-02-25 10:04:23