簡體   English   中英

如何將 Linux 服務器中的 MySQL 表名更改為不區分大小寫?

[英]How to change MySQL table names in Linux server to be case insensitive?

我正在處理一個以前托管在 Apple 服務器上的舊網站。 當它遷移到新的 Linux 服務器時,它停止工作。 我很確定這是因為在 php 腳本中使用的所有 MySQL 查詢對表名都有不同的大小寫組合(我不知道為什么原始開發人員在創建表名或 php 腳本時沒有遵循任何約定) 這並不重要,因為 Mac 和 Windows MySQL 服務器在默認情況下都不區分大小寫。 但是,Linux 不是。

有沒有辦法更改 MySQL 上的 Linux 默認值,使其不區分大小寫,並且像 Mac 或 Windows 一樣工作? 我一直在尋找,但沒有找到任何不涉及更改腳本或表名或兩者的答案。 該網站必須是使用某些 CMS 生成的,因此有數十個頁面,並且在每個和數百個表中包含具有多個查詢的文件。 我開始嘗試以我能想到的最聰明的方式實現這種類型的解決方案,但是如果我觸摸表名,則其他當前工作的頁面將停止工作(我試圖避免進一步破壞站點)。

在 Linux 服務器的 Webmin 中的 MySQL 服務器控制台中有一個系統變量 (lower_case_table_names),我讀取它可以從 0 更改為 1 以解決此問題,但 Webmin 不會讓我更改它,因為它是“只讀” “ 多變的。

你會認為這將是一個很容易解決的問題,但到目前為止我正在失去希望。 我希望有人能得到一個目前可能無法回答的答案。

MySQL 的區分大小寫默認由文件系統處理,這就是您發現此差異的原因:

9.2.2. 標識符區分大小寫

在 MySQL 中,數據庫對應於數據目錄中的目錄。 數據庫中的每個表對應於數據庫目錄中的至少一個文件(可能更多,取決於存儲引擎)。 因此,底層操作系統的區分大小寫在數據庫和表名稱的區分大小寫中起作用。 這意味着數據庫和表名在 Windows 中不區分大小寫,而在大多數 Unix 版本中區分大小寫。 一個值得注意的例外是 Mac OS X,它基於 Unix,但使用不區分大小寫的默認文件系統類型 (HFS+)。 然而,Mac OS X 也支持 UFS 卷,就像在任何 Unix 上一樣區分大小寫。 請參閱第 1.8.4 節,“標准 SQL 的 MySQL 擴展”。

幸運的是,下一句話可以幫助你:

lower_case_table_names系統變量還會影響服務器處理標識符區分大小寫的方式,如本節后面所述。

lower_case_table_names簡介:

如果設置為 0,則表名按指定存儲,並且比較區分大小寫。 如果設置為 1,表名以小寫形式存儲在磁盤上,並且比較不區分大小寫。 如果設置為 2,則表名按給定存儲,但以小寫形式進行比較。 此選項也適用於數據庫名稱和表別名。 有關其他信息,請參閱第 9.2.2 節,“標識符區分大小寫”。

如果您在具有不區分大小寫的文件名的系統(例如 Windows 或 Mac OS X)上運行 MySQL,則不應將此變量設置為 0。 如果在這樣的系統上將此變量設置為 0 並使用不同的字母訪問 MyISAM 表名,則可能會導致索引損壞。 在 Windows 上,默認值為 1。在 Mac OS X 上,默認值為 2。

所以看起來你應該在 MySQL 配置文件中將lower_case_table_names設置為1

一個同名的 MySQL 服務器變量 您可能需要在系統啟動時設置該特定變量,如本幫助頁面中所述 您必須為您的數據庫服務器實例找到 MySQL 選項文件的位置(我的位於/etc/my.cnf )並將此選項編輯/添加到[mysqld]部分。

之后不要忘記重新啟動 MySQL 守護進程...

編輯mysql配置文件

nano /etc/mysql/my.cnf

或任何其他用於配置mysql my.cnf文件。

在下面

[mysqld]

添加行

lower_case_table_names=1

跑步

sudo service mysqld restart

您可能希望將 Windows 數據庫重新導入到 linux 數據庫中。 最好從頭開始,使用 add table 和 insert 語句。

很好!

您不能在 mysql 運行時更改lower_case_table_names的值 - 它需要在啟動時設置。 您將需要編輯my.cnf (可能在/etc ,也可能在其他地方,不確定)。 然后重啟mysql,你應該就好了。

這是因為您使用的文件系統。 這被解釋為

In MySQL, databases correspond to directories within the data directory.
Each table within a database corresponds to at least one file within the database directory (and possibly more, depending on the storage engine). 
Triggers also correspond to files. Consequently, the case sensitivity of the underlying operating system plays a part in the case sensitivity of database, table, and trigger names. 
This means such names are not case-sensitive in Windows, but are case-sensitive in most varieties of Unix. 
One notable exception is macOS, which is Unix-based but uses a default file system type (HFS+) that is not case-sensitive. 
However, macOS also supports UFS volumes, which are case-sensitive just as on any Unix.

您可以在 mysql 官方網站上閱讀更多信息

您必須通過運行以下查詢來檢查區分大小寫以了解數據庫的區分大小寫:

SHOW VARIABLES LIKE "lower_case_table_names";

值 0(Linux 上的默認值)表示名稱比較區分大小寫,值 1(Windows 上的默認值)表示不區分大小寫,而值 2(macos 上的默認值)也可以被視為不區分大小寫。

現在,如果查詢結果為 0,那么您需要更改lower_case_table_names變量以使您的數據庫不區分大小寫。

請記住備份您的數據庫,因為更改此變量的值后,您的數據庫可能表現不佳。 您可以恢復數據庫后使其不區分大小寫。 使用以下命令備份您的數據庫(並應在備份后將其刪除):

mysqldump -u username -p db_name > dump.sql

現在,您需要找到您的 mysql 配置文件。 配置文件可以在

/etc/mysql/my.cnf

/etc/mysql/mysql.conf.d/mysqld.cnf

您需要查找 [mysqld],無論您找到哪個文件的詳細信息(其中之一):

[mysqld]
user            = mysql
pid-file        = /***
socket          = /***
port            = ****
basedir         = /***
datadir         = /***
tmpdir          = /tmp
lc-messages-dir = /****

編輯您的文件:

vi /etc/mysql/mysql.conf.d/mysqld.cnf

並將lower_case_table_names=1行粘貼到[mysqld]下方

您需要重新啟動 mysql 為:

sudo service mysql restart

您現在可以使用以下命令恢復數據庫:

mysql -u username -p db_name < dump.sql

完畢。 干杯。

在創建數據庫實例之前,應將lower_case_table_names 參數設置為自定義數據庫參數組的一部分。 您應該避免更改現有數據庫實例的lower_case_table_names 參數,因為這樣做可能會導致與時間點恢復備份和只讀副本數據庫實例不一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM