MacOS上的MySQL区分大小写表名称,不区分大小写的文件系统

时间:2015-06-11 11:23:04

标签: mysql macos case-sensitive

我已经研究了很多,而且我理解为使数据库表名称敏感,你必须设置变量lower_case_table_names = 0。 我在osX上。我在my.cnf做了这个改变。 之后,如果我跑

select * from users

我得到了结果。如果我跑:

select * from Users

我收到错误,说表不存在。

但是,对于特定数据库,区分大小写不会影响。我可以使用任何我永远不会收到错误的情况。为什么?我可以看一下用于导入数据库的大sql文件,并试着找出是否有特定的指令来忽略区分大小写(?)。 无论如何,为什么你认为区分大小写适用于所有数据库而不是我感兴趣的那个?其中一个区分大小写的是InnoDB。虽然不关心这个的是MyIsam。可能是原因吗?在这种情况下有什么工作吗?

7 个答案:

答案 0 :(得分:4)

MacOsx 10.13,码头工人 3.0.1。
lower_case_table_names 更改为 0 对我没有帮助。 Mysql报错

[ERROR] The server option ‘lower_case_table_names’ is configured to use case sensitive table names but the data directory is on a case-insensitive file system which is an unsupported combination. Please consider either using a case sensitive file system for your data directory or switching to a case-insensitive table name mode.

在 docker 设置中关闭此设置 Use gRPC FUSE for file sharing 有助于: enter image description here

答案 1 :(得分:3)

Linux中的表格和列是区分大小写!要使它们不区分大小写,请按照:

  

打开终端并修改/etc/mysql/my.cnf

sudo nano /etc/mysql/my.cnf
     

[mysqld]部分下方添加:

lower_case_table_names = 1
     

重启mysql

sudo /etc/init.d/mysql restart
     

然后在这里查看:

mysqladmin -u root -p variables

仅改变lower_case_table_names设置是不够的。它需要在导入数据库之前完成。

MySQL 5.7 documentation列出了在Windows和Linux / UNIX之间移动的过程。关于Mac OSX的注释:

  

一个值得注意的例外是OS X,它基于Unix但使用默认值   不区分大小写的文件系统类型(HFS +)。但是,OS X也是   支持UFS卷,它与任何Unix一样区分大小写。

查看手册页以确保遵循所需的强制区分大小写的规则。看一看并验证您是否按正确的顺序执行了这些步骤:

  

要转换一个或多个整个数据库,请在设置之前转储它们   lower_case_table_names,然后删除数据库,然后重新加载它们   设置lower_case_table_names:

     

1 - 使用mysqldump转储每个数据库:

     

mysqldump --databases db1> db1.sql

     

mysqldump --databases db2>   db2.sql

     

...对每个必须重新创建的数据库执行此操作。

     

2 - 使用DROP DATABASE删除每个数据库。

     

3 - 停止服务器,在lower_case_table_names文件的[mysqld]部分设置\etc\mysql\my.cnf,然后重新启动服务器。

     

4 - 为每个数据库重新加载转储文件。因为lower_case_table_names   设置后,每个数据库和表名都将转换为小写   它被重新创建:

     

mysql< db1.sql

     

mysql< db2.sql

关于MySQL系统变量lower_case_table_names服务器变量(或设置):

enter image description here

其他参考文献:

答案 2 :(得分:3)

case sensitivity of database and table names取决于底层操作系统和文件系统。

在Windows上,他们不区分区分大小写。在Linux上,他们 区分大小写。

OSX处于中间位置; HFS文件系统支持区分大小写和不区分大小写的文件名(但不是同时)。这取决于它的格式化。

答案 3 :(得分:0)

  

但是,对于特定数据库,区分大小写不具备   影响。我可以使用任何我永远不会收到错误的情况。为什么呢?

这是因为只使用不区分大小写的选项(默认情况下)创建了此数据库。首先需要在创建数据库之前将区分大小写的选项放在sql create script的顶部,这样DBMS就可以了。

答案 4 :(得分:0)

  1. /etc/mysql/my.cnf

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

    [mysqld]

    lower_case_table_names=1

  4. sudo /etc/init.d/mysql restart

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

答案 5 :(得分:0)

mysql手册说明:

  

如果您计划在Unix上将lower_case_table_names系统变量设置为1,则必须先将旧数据库和表名转换为小写,然后再停止mysqld并使用新变量设置重新启动它。

答案 6 :(得分:0)

默认情况下,表别名在Unix上区分大小写,但在Windows或macOS上不区分大小写。而且您不能在OSX上强制执行此操作。

MySql文档给出以下建议:

为避免此类差异引起的问题,最好采用一致的约定,例如始终使用小写名称创建和引用数据库和表。建议使用此约定,以实现最大的可移植性和易用性。

在MySQL中,数据库对应于数据目录中的目录。数据库中的每个表都对应于数据库目录中的至少一个文件(可能还有更多文件,具体取决于存储引擎)。触发器也对应于文件。因此,基础操作系统的区分大小写在数据库,表和触发器名称的区分大小写中发挥了作用。这意味着这些名称在Windows中不区分大小写,但在大多数Unix版本中都区分大小写。 一个值得注意的例外是macOS,它基于Unix,但使用不区分大小写的默认文件系统类型(HFS +)。。但是,macOS还支持UFS卷,该卷也区分大小写。在任何Unix上。请参见第1.7.1节“ MySQL对标准SQL的扩展”。 lower_case_table_names系统变量还会影响服务器处理标识符区分大小写的方式,如本节稍后所述。

建议在所有系统上使用 lower_case_table_names = 1 ,但是这样做的缺点是,当您使用SHOW TABLES或SHOW DATABASES时,在原始情况下看不到名称。 / p>

变量 lower_case_table_names 默认情况下为0,这表示表名称按指定存储,并且比较区分大小写。

这是可能的值:

  • 0:表名称按指定存储,并且比较区分大小写。
  • 1:表名以小写形式存储在磁盘上,比较不区分大小写。
  • 2:表名按给定存储,但以小写形式进行比较。此选项也适用于数据库名称和表别名。

在Windows上,默认值为1。在macOS上,默认值为2。在Linux上,不支持值2。服务器将值强制改为0。

这是你的答案

如果在数据目录位于不区分大小写的文件系统(例如Windows或macOS)上的系统上运行MySQL,则不应将lower_case_table_names设置为0。这是不受支持的组合,当使用错误的tbl_name字母大小写运行INSERT INTO ... SELECT ... FROM tbl_name操作时,可能导致挂起状态。使用MyISAM,使用不同的字母大小写访问表名称可能会导致索引损坏。

如果在不区分大小写的文件系统上尝试使用--lower_case_table_names = 0启动服务器,则会打印一条错误消息,并且服务器将退出。

您可以在my.cnf文件中进行更改,并且可以使用以下命令找到它(如果您使用的是基于unix的系统)

mysql --help | grep cnf

参考:

MySQL 5.7 Reference Manual Identifier Case Sensitivity

MySQL 5.7 Reference Manual 5.1.7 Server System Variables