2012-04-25 49 views
1

我在三個不同的服務器上工作,它們是unix/windows/unix。MySql - 不同服務器中表的大小寫敏感問題

case-1:在這是我的UNIX服務器loacl我有一個表名Country_master及其字段pk_CountryId,國家或地區名稱等

case-2:在這窗口表名我的演示服務器自動更改爲country_master。

case-3:在我的Live服務器中,它是unix表名country_master。

但在我的碼錶我取的名字是Country_master所以它給我的錯誤是這樣

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'markets.Country_master' doesn't exist'. 

我能有什麼辦法不要在數據庫,並在代碼中更改表的名稱,但它需要小寫?

+0

男士如果此問題有幫助,您也可以upvote不僅回答... – 2013-03-14 07:24:04

回答

1

如果你正在使用MySQL,你可以使用以下指令

set-variable = lower_case_table_names=1 

不要忘記更新之後重新啓動服務器設置表和列名情況my.conf敏感。如果您在所有服務器上使用相同的列名稱會更好

+0

+1有用的答案。 – 2013-05-09 11:33:54

2

fine manual

在MySQL中,數據庫對應數據目錄中的目錄。數據庫中的每個表對應於數據庫目錄中的至少一個文件(可能更多,取決於存儲引擎)。觸發器也對應於文件。因此,底層操作系統的區分大小寫在數據庫,表和觸發器名稱的區分大小寫的情況下起作用。

因此,表名稱的大小寫敏感性取決於底層文件系統:它們(通常)在Windows和OSX上不區分大小寫,但在Linux上區分大小寫。此行爲部分取決於lower_case_table_names設置:

如果設置爲0,表名將按指定進行存儲,並且比較區分大小寫。如果設置爲1,表名將以小寫形式存儲在磁盤上,並且比較不區分大小寫。如果設置爲2,則表名按照給定值存儲,但以小寫字母進行比較。該選項也適用於數據庫名稱和表別名。

因此,你有各種各樣的事情會影響你的表名的大小寫敏感性。唯一理智的解決方案(IMO)應始終使用小寫字母表名,以便您不必擔心;您還應該使用小寫字母列名稱以保持一致。

+0

+1有用的答案。 – 2013-04-04 09:43:35

1

http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html

9.2.2。標識符區分大小寫在MySQL中,數據庫對應於數據目錄中的目錄。數據庫 中的每個表對應於數據庫目錄中的至少一個文件(並且根據存儲引擎的不同,可能更多的文件爲 )。因此,底層操作系統的區分大小寫在 中對數據庫和表名稱的大小寫敏感。這意味着數據庫 和表名在Windows中不區分大小寫,在大多數Unix中區分大小寫的 。一個明顯的例外是Mac OS X,它是基於Unix的 ,但使用默認文件系統類型(HFS +),而非 敏感。但是,Mac OS X也支持UFS卷,與任何Unix一樣,它的敏感度爲 。請參見第1.8.4節「MySQL擴展至 標準SQL」。 lower_case_table_names系統變量也會影響 服務器如何處理標識符區分大小寫,如本節後面的 所述。

注意儘管某些 平臺上的數據庫和表名不區分大小寫,但不應在同一語句中使用不同的情況引用給定的數據庫或表。下面的語句 是行不通的,因爲它是指一個表既作爲MY_TABLE和 MY_TABLE:

的mysql> SELECT * FROM MY_TABLE WHERE MY_TABLE.col = 1;列,索引和 存儲的例程名稱在任何平臺上都不區分大小寫,也不是列別名。觸發器名稱區分大小寫,與標準SQL 不同。

默認情況下,表的別名是區分在Unix敏感,但不能因此就 Windows或Mac OS X.下面的語句將不會在Unix上, 工作,因爲它指的是別名既作爲和爲A:

mysql> SELECT col_name FROM tbl_name AS a - > WHERE a.col_name = 1 OR A.col_name = 2;但是,Windows上也允許使用相同的語句。爲避免這種差異導致的問題,最好採用一致的約定,如 總是使用小寫字母 名稱創建和引用數據庫和表。建議使用此慣例以實現最大限度的便攜性並簡化使用。

如何將表和數據庫名稱存儲在磁盤上並在MySQL中使用是 受lower_case_table_names系統變量影響,您可以在啓動mysqld時設置 。 lower_case_table_names可以採用下表中顯示的值 。在Unix上,中 的lower_case_table_names的默認值是0在Windows中的默認值是1。在Mac OS X,默認值是2

值含義0表和數據庫名稱使用 存儲在磁盤上在CREATE TABLE或CREATE DATABASE語句中指定的lettercase。 名稱比較區分大小寫。如果您在具有不區分大小寫的 文件名(例如Windows或Mac OS X)的系統上運行MySQL,則不應將此變量 設置爲0。如果在不區分大小寫的文件系統 上使用--lower-case-table-names = 0強制將此變量 設置爲0,並使用不同的lettercases訪問MyISAM表名,則可能導致索引 損壞。 1表名以小寫形式存儲在磁盤 中,名稱比較不區分大小寫。 MySQL在存儲和查找中將所有表 名稱轉換爲小寫。此行爲也適用於數據庫名稱和表別名 。 2使用CREATE TABLE或 CREATE DATABASE語句中指定的lettercase存儲在磁盤上的表和數據庫名稱爲 ,但MySQL在 查找中將它們轉換爲小寫。名稱比較不區分大小寫。這僅適用於 不區分大小寫的文件系統! InnoDB表名爲 ,以lower_case_table_names = 1存儲。如果您僅在一個平臺上使用 MySQL,則通常不必將其lower_case_table_names變量的默認值更改爲 。但是,如果要在文件系統區分大小寫不同的 平臺之間傳輸表,則可能會遇到困難。例如,在Unix上的 上,可以有兩個不同的表,分別命名爲my_table和MY_TABLE, ,但在Windows上,這兩個名稱被認爲是相同的。爲避免數據庫或表名稱的信箱傳輸問題 您有兩種選擇:

在所有系統上使用lower_case_table_names = 1。這樣做的主要缺點 是,當你使用SHOW TABLES或SHOW DATABASES時,你做 看不到他們原來的lettercase中的名字。

在Unix上使用lower_case_table_names = 0,在 Windows上使用lower_case_table_names = 2。這保留了數據庫和表名的字母大小寫。 這樣做的缺點是,您必須確保您的陳述 始終在Windows上使用正確的 lettercase引用數據庫和表名。如果您將語句轉移到Unix,其中 lettercase很重要,但如果lettercase不正確,則它們不起作用。

例外:如果你正使用InnoDB表,你要設法避免 這些數據傳輸的問題,您應該設置的lower_case_table_names到 1在所有平臺上,迫使名稱轉換爲小寫。

如果您計劃在系統的lower_case_table_names變量設置爲1的 的Unix,你必須首先停止mysqld的和新 變量設置重新啓動前轉換您的舊的數據庫和表名 小寫。要對單個表執行此操作,請使用RENAME TABLE:

RENAME TABLE T1 TO t1;將一個或多個完整的數據庫,設置的lower_case_table_names之前拋售 它們,然後刪除數據庫, 和設置的lower_case_table_names後重新加載它們:

使用mysqldump轉儲每個數據庫:

的mysqldump --databases DB1> DB1 .sql mysqldump --databases db2> db2.sql ...爲每個必須重新創建的數據庫執行此操作。

使用DROP DATABASE刪除每個數據庫。

停止服務器,設置lower_case_table_names,然後重新啓動服務器。

重新加載每個數據庫的轉儲文件。由於的lower_case_table_names 設置,每個數據庫和表的名字將被轉換爲小寫爲 它重建:

mysql的< db1.sql MySQL的< db2.sql ...對象名稱可能,如果他們的大寫形式被認爲是 重複根據二進制 排序規則相等。對於遊標,條件,程序,函數,保存點,存儲的例程參數以及存儲程序 局部變量的名稱均如此。列名, 約束,數據庫,使用PREPARE準備的語句,表格, 觸發器,用戶和用戶定義變量的名稱不是這樣。

+0

+1有用的答案。 – 2013-04-04 09:43:16