小白学习MySQL - 大小写敏感问题解惑

Posted bisal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小白学习MySQL - 大小写敏感问题解惑相关的知识,希望对你有一定的参考价值。

Oracle中大小写敏感的问题》这篇文章介绍了Oracle数据库中对大小写的敏感问题。不同的数据库有不同的设计思路,有的可能偏灵活,有的可能偏严谨,这就需要使用者,能够了解她们的联系和区别,才可以准确运用数据库提供给我们的特性和功能。

mysql中的数据库对应到操作系统上存储的数据文件,因此像数据库名、表名、触发器名称等,是否大小写敏感就取决于他所在的操作系统。例如在Windows就是大小写不敏感,但是在大多数Unix就是大小写敏感的,其中一个例外,就是macOS,他采用HFS+文件类型,就是大小写不敏感的,他采用UFS文件类型,就是大小写敏感。

MySQL中的列、索引、存储过程、事件名等在任何操作系统上都是大小写不敏感的,但是列的别名则是例外。日志文件组的名称是大小写敏感的。默认情况下,表的别名在Unix中,是大小写敏感的,在Windows和macOS是大小写不敏感的,如下SQL在Unix中,会提示错误,Unknown column 'A.col_name' in 'where clause',但是在Windows中,则正常执行,

mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;

因此,官方都推荐在创建和引用数据库对象的时候采用统一的大小写标准,例如都采用小写,这会带来最大的可用性和易用性。

数据库和表名的存储和使用受到了MySQL参数lower_case_table_names的控制(此参数不可以动态修改,必须重启数据库),该值描述如下,

P.S.

https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html

概括一下就是,

(1) lower_case_table_names = 0(Unix默认)

表名存储为给定的大小和比较是区分大小写的。

(2) lower_case_table_names = 1(Windows默认)

表名存储在磁盘是小写的,但是比较的时候是不区分大小写。
(3) lower_case_table_names = 2(macOS默认)

表名存储为给定的大小写,但是比较的时候是小写的。

如果你只是在一个操作系统上使用MySQL,不用关注参数值的不同带来的差异,但如果你需要在不同大小写敏感的平台之间迁移数据,就得关注这个参数了,举个例子,Unix下可以创建两张表,一个叫TBL,一个叫tbl,但是在Windows,他们指的就是同一张表。

因此为了避免这种迁移过程中大小写敏感的问题,有两个选择,

1. 在所有的系统中,都设置lower_case_table_names是1,唯一的缺点,就是当时用show tables或者show databases,不会看到原始大小写。

2. Unix中设置lower_case_table_names是0,Windows中设置lower_case_table_names是2。缺点就是需要确保在Windows中引用正确大小写的数据库和表名。

Unix中如果将lower_case_table_names改为1,在重启进程前,需要将旧的数据库和表名改成小写(如果不改,会导致已存在的大写对象不能使用),可以使用rename,

RENAME TABLE T1 TO t1;

如果有很多数据库需要改,则可以导出,设置参数,再导入,

1. 导出数据库,

mysqldump --databases db1 > db1.sql
mysqldump --databases db2 > db2.sql
...

2. drop database删除数据库。

3. stop server -> 设置lower_case_table_names -> restart server。

4. 重新加载数据库,

mysql < db1.sql
mysql < db2.sql
...

大小写敏感的问题看着很小,但若不注意,尤其存在跨平台的需求,就会更加复杂。其实一定程度上,这就牵扯到了设计开发规范的问题,如果要求MySQL的对象设计和代码开发,都统一使用小写,lower_case_table_names是多少就不那么重要了。其实,我也没太想明白,为什么有的数据库,对象名称会使用所谓的驼峰形式,大小写混搭,无论是对象维护,还是代码开发,都徒增了烦恼,夹杂隐患,或者有些我不清楚的隐藏原因?如果谁知道,还请指点迷津。

近期更新的文章:

小白学习MySQL - only_full_group_by的校验规则

PG逻辑复制的REPLICA IDENTITY设置

Linux的dd指令

Oracle、SQL Server和MySQL的隐式转换异同

JDK的版本号解惑

文章分类和索引:

《公众号800篇文章分类和索引

以上是关于小白学习MySQL - 大小写敏感问题解惑的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL如何设置大小写敏感

windows下mysql数据库表名大小写不敏感

mysql大小写敏感问题

python小白学习记录 多线程爬取ts片段

MySQL大小写敏感

MySQL大小写敏感问题和命名规范