【问题标题】:Are table names in MySQL case sensitive?MySQL中的表名是否区分大小写?
【发布时间】:2011-09-02 07:17:18
【问题描述】:

MySQL 中的表名是否区分大小写?

在我的 Windows 开发机器上,我拥有的代码能够查询我的表,这些表似乎都是小写的。当我部署到我们数据中心的测试服务器时,表名似乎以大写字母开头。

我们使用的服务器都在 Ubuntu 上。

【问题讨论】:

标签: mysql case-sensitive mysql5


【解决方案1】:

MySQL 中的表名是文件系统条目,因此如果底层文件系统是,则它们不区分大小写。

【讨论】:

  • 我不认为 InnoDB 表总是如此。
  • @SimonEast 请你给出一个你这么认为的理由?
【解决方案2】:

一般:

数据库和表名在 Windows 中不区分大小写,在大多数 Unix 中区分大小写。

在 MySQL 中,数据库对应于数据中的目录 目录。数据库中的每个表至少对应一个 数据库目录中的文件。因此,区分大小写 底层操作系统在区分大小写方面发挥了作用 数据库和表名。

可以使用系统变量lower_case_table_names(在[mysqld]下的my.cnf配置文件中)配置表名在磁盘上的存储方式。

阅读该部分:10.2.2 Identifier Case Sensitivity 了解更多信息。

【讨论】:

  • 这完全烧死了我,因为我的代码在本地 Windows 环境中运行良好,但在 linux 上投入生产时抛出异常!谢谢!
  • 这个答案有一个警告,文档中没有提到:InnoDB 不使用数据库和表的文件或目录名称,因此 its 对象是 总是不区分大小写,即使在区分大小写的系统上运行。请参阅此问题以了解可能因此而出错的示例:stackoverflow.com/questions/23182969/…
  • 这不是故事的全部。请参阅 StephenLembert 的答案,因为它是可配置的
  • 默认情况下,大多数 mac 计算机使用不区分大小写的文件系统。不过,您可以选择让您的文件系统区分大小写。
  • 这和文件名区分大小写是导致我作为 Web 开发人员转向 Ubuntu 的原因之一。
【解决方案3】:

数据库和表名在 Windows 中不区分大小写,在大多数 Unix 或 Linux 中区分大小写。

要解决此问题,请将 lower_case_table_names 设置为 1

lower_case_table_names=1

这将使您的所有表格小写,无论您如何编写它们。

【讨论】:

  • 它们在 MacOS X 上也不区分大小写,尽管底层 Unix 是。这大概就是为什么在 Mac 上的 MySQL 中的自动完成对表或字段名称是区分大小写的,即使查询不是。
  • 是的,但是要放这句话吗?我猜它在:/etc/mysql/my.cnf 下面 [mysql] 组。但这还不够,还需要做其他事情(当然除了重启mysql...
  • 这只影响新表。在更改此设置之前,必须将现有表重命名为小写。
  • 在哪里设置“lower_case_table_names=1”?有人在某处提到它需要在 /etc/mysql 下的 my.cnf 中完成,但服务器重启失败。
  • 你可以在名为“/etc/mysql/mysql.conf.d/mysqld.cnf”的文件中找到[mysqld]。编辑该文件并在 [mysqld] 下添加行 lower_case_table_names=1。
【解决方案4】:

这取决于lower_case_table_names系统变量:

show variables where Variable_name='lower_case_table_names'

这有三个可能的值:

  • 0 - 在CREATE TABLECREATE DATABASE 语句中指定的字母大小写。名称比较区分大小写。
  • 1 - 表名以小写形式存储在磁盘上,并且名称比较不区分大小写。
  • 2 - 在 CREATE TABLECREATE DATABASE 语句中指定的字母大小写,但 MySQL 在查找时将它们转换为小写。 名称比较不区分大小写。

Documentation

【讨论】:

    【解决方案5】:
    1. /etc/mysql/my.cnf找到文件

    2. 通过添加以下行来编辑文件:

       [mysqld]
      
       lower_case_table_names=1
      
    3. sudo /etc/init.d/mysql restart

    4. 现在运行 mysqladmin -u root -p variables | grep table 以检查 lower_case_table_names 是否为 1

    您可能需要重新创建这些表才能使其正常工作。

    【讨论】:

    • 如果您收到错误Different lower_case_table_names settings for server ('1') and data dictionary ('0').,请重新创建数据库/表。
    猜你喜欢
    • 2011-01-01
    • 2020-12-09
    • 2023-03-22
    • 2014-01-19
    相关资源
    最近更新 更多