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

2024-11-04 08:43:00
admin
原创
38
摘要:问题描述:我正在开发一个旧网站,该网站以前托管在 Apple 服务器上。当它被迁移到新的 Linux 服务器时,它停止工作了。我很确定这是因为 php 脚本中使用的所有 MySQL 查询的表名都有不同的大小写组合(我不知道为什么原始开发人员在创建表名或 php 脚本时没有遵循任何约定),而且这并不重要,因为 ...

问题描述:

我正在开发一个旧网站,该网站以前托管在 Apple 服务器上。当它被迁移到新的 Linux 服务器时,它停止工作了。我很确定这是因为 php 脚本中使用的所有 MySQL 查询的表名都有不同的大小写组合(我不知道为什么原始开发人员在创建表名或 php 脚本时没有遵循任何约定),而且这并不重要,因为 Mac 和 Windows MySQL 服务器默认不区分大小写。但是,Linux 不是。

有没有办法更改 MySQL 上的 Linux 默认值,使其不区分大小写,并像 Mac 或 Windows 一样工作?我一直在寻找,但找不到任何不涉及更改脚本或表名或两者的答案。该网站一定是使用某个 CMS 生成的,因此有几十个页面,每个页面都包含多个查询,还有数百个表。我开始尝试以我能想到的最聪明的方式实现这种类型的解决方案,但如果我触碰表名,那么其他当前正在运行的页面就会停止工作(我试图避免进一步破坏网站)。

Linux 服务器中 Webmin 的 MySQL 服务器控制台中有一个系统变量(lower_case_table_names),我读到可以将其从 0 更改为 1 来解决此问题,但 Webmin 不允许我更改它,因为它是一个“只读”变量。

你可能认为这是一个很容易解决的问题,但到目前为止,我已失去希望。我希望有人能给我一个目前可能还不明白的答案。


解决方案 1:

MySQL 的大小写区分默认由文件系统处理,这就是您发现这种差异的原因:

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系统变量还会影响服务器如何处理标识符区分大小写,如本节后面所述。

简介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

解决方案 2:

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

之后不要忘记重新启动 MySQL 守护进程...

解决方案 3:

编辑mysql配置文件

nano /etc/mysql/my.cnf

或任何其他my.cnf用于配置您的文件mysql

在下面

[mysqld]

添加行

lower_case_table_names=1

跑步

sudo service mysqld restart

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

很好!

解决方案 4:

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

解决方案 5:

这是由于您使用的文件系统造成的。解释如下

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

完成了。干杯。

解决方案 6:

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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用