如何将Linux服务器上的MySQL表名更改为不区分大小写?

18
我正在处理一个古老的网站,它曾经托管在苹果服务器上。当它迁移到新的 Linux 服务器上后停止运行。我非常确定这是因为在 php 脚本中使用的所有 MySQL 查询具有不同的表名大小写组合(我不知道原始开发人员在创建表名或 php 脚本时为什么不遵循任何约定),而且这并不重要,因为 Mac 和 Windows 的 MySQL 服务器默认情况下在这方面都是不区分大小写的。但是,Linux 不是。
有没有办法更改 Linux 上 MySQL 的默认设置,使其变为不区分大小写,并像 Mac 或 Windows 一样工作?我一直在寻找答案,但没有找到任何不涉及更改脚本或表名或两者的答案。该网站必须是使用某种 CMS 生成的,因此有数十个页面和包含多个查询的包含文件以及数百个表格。我开始尝试以我能想到的最聪明的方式来实现这种解决方案,但是如果我修改表名,则其他当前正常工作的页面会停止工作(我正在尝试避免进一步破坏站点)。
MySQL 服务器控制台中的系统变量(lower_case_table_names)在 Linux 服务器的 Webmin 中,据我所读,可以将其从 0 更改为 1 来解决此问题,但是 Webmin 不允许我更改它,因为它是“只读”变量。
你会认为这将是一个容易解决的问题,但到目前为止,我正在失去希望。我希望有人能够提供答案,也许是我暂时还没有想到的。
6个回答

20

MySQL的大小写处理默认由文件系统处理,这就是你找到这种差异的原因:

9.2.2. 标识符大小写敏感性

在MySQL中,数据库对应于数据目录中的目录。每个数据库中的表对应于数据库目录中的至少一个文件(根据存储引擎可能还有更多)。因此,底层操作系统的大小写敏感性影响数据库和表名的大小写敏感性。这意味着在Windows中,数据库和表名不区分大小写,在大多数Unix版本中区分大小写。其中一个值得注意的例外是基于Unix的Mac OS X,它使用默认文件系统类型(HFS+)不区分大小写。但是,Mac OS X也支持UFS卷,它们与任何Unix上一样区分大小写。请参阅1.8.4节“MySQL对标准SQL的扩展”。

幸运的是,接下来的句子可以帮助您:

lower_case_table_names系统变量也会影响服务器处理标识符大小写敏感性的方式,如本节后面所述。

lower_case_table_names摘要:

如果设置为0,则表名称按指定方式存储,比较区分大小写。如果设置为1,则表名称在磁盘上以小写形式存储,比较不区分大小写。如果设置为2,则表名称按给定方式存储,但是以小写形式进行比较。此选项还适用于数据库名称和表别名。有关更多信息,请参阅9.2.2节“标识符大小写敏感性”。

如果您在运行具有不区分大小写文件名的系统(如Windows或Mac OS X)上的MySQL,并访问使用不同大小写字母的MyISAM表名,则不应将此变量设置为0,否则可能导致索引损坏。在Windows上,默认值为1。在Mac OS X上,默认值为2。

看起来你需要在 MySQL 配置文件中设置 lower_case_table_names1


我尝试通过服务器配置选项来更改它,但它不允许我更改。 1. 我会看看我的服务器管理员是否可以通过Linux命令控制台来更改它。谢谢。 - rocklandcitizen
1
是的,这个解决方案修复了问题。 - JCalcines
1
你需要在 [mysqld] 部分下添加 'lower_case_table_names = 1'。 - Jeroen Vandevelde

13

这里有一个同名的MySQL服务器变量。你可能需要在系统启动时设置该特定变量,如这个帮助页面所述。你需要找到MySQL选项文件的位置(我的在/etc/my.cnf),然后将此选项编辑/添加到[mysqld]部分。

别忘了之后重新启动MySQL守护进程...


这对我非常有效:在Windows中,默认情况下我有小写表,现在我可以在Linux中正确地导出它们,我不会因大小写问题而感到无聊。谢谢! - Sébastien

11

编辑mysql配置文件

nano /etc/mysql/my.cnf

或任何其他用于配置您的 mysqlmy.cnf 文件。

[mysqld]

添加这行内容

lower_case_table_names=1

运行

sudo service mysqld restart

您可能希望将Windows数据库重新导入Linux数据库,最好从头开始,使用添加表和插入语句。

很好!


你可以在名为“/etc/mysql/mysql.conf.d/mysqld.cnf”的文件中找到[mysqld]。编辑该文件,在[mysqld]下添加一行lower_case_table_names=1。 - Hemant Nagpal

3

在mysql运行时,您无法更改lower_case_table_names的值 - 它需要在启动时设置。 您需要编辑my.cnf(可能在/etc中,也可能在其他地方,不确定)。 然后重新启动mysql,您就可以了。


1
因为您使用的文件系统不同,导致出现了这种情况。这可以解释为:
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

在 [mysqld] 下面粘贴一行 lower_case_table_names=1
你需要重启 MySQL:
sudo service mysql restart

您现在可以使用以下命令恢复您的数据库:
mysql -u username -p db_name < dump.sql

完成。干杯。


0

在创建数据库实例之前,应将lower_case_table_names参数设置为自定义DB参数组的一部分。您应该避免更改现有数据库实例的lower_case_table_names参数,因为这样做可能会导致与时间点恢复备份和读取副本DB实例不一致的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接