【问题标题】:How to change MySQL table names in Linux server to be case insensitive?如何将 Linux 服务器中的 MySQL 表名更改为不区分大小写?
【发布时间】:2021-07-29 04:46:45
【问题描述】:

我正在开发一个曾经托管在 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 linux case-insensitive


    【解决方案1】:

    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

    【讨论】:

    • 我尝试通过服务器配置选项进行更改,但它不允许我更改它 1. 我将看看我的服务器管理员是否可以通过 Linux 命令控制台更改它。谢谢。
    • 是的,这个解决方案可以解决问题。
    • 你需要在[mysqld]部分下添加'lower_case_table_names = 1'。
    【解决方案2】:

    a MySQL server variable with the same name。您可能需要在系统启动时设置该特定变量,如this help page 中所述。您必须为您的数据库服务器实例找到 MySQL 选项文件的位置(我的位于 /etc/my.cnf),然后将此选项编辑/添加到 [mysqld] 部分。

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

    【讨论】:

    • 这对我很有用:我在 Windows 中默认有小写表格,现在我可以在 linux 中正确导出它们,我不会对大小写问题感到厌烦。谢谢!
    【解决方案3】:

    编辑mysql配置文件

    nano /etc/mysql/my.cnf
    

    或用于配置您的mysql 的任何其他my.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。
    【解决方案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.
      

      您可以阅读更多here at mysql official site

      您必须通过运行以下查询来检查是否区分大小写,以了解您的数据库是否区分大小写:

      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
      

      完成。干杯。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2019-12-27
          • 2011-03-24
          • 2013-01-26
          • 2013-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-18
          相关资源
          最近更新 更多