介绍
在 MySQL
中,数据库对应数据目录中的目录,数据库中的每个表至少对应数据库目录中的一个文件(也可能是多个,取决于存储引擎)。因此,所使用操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性
。
在大多数 Unix
中数据库名和表名对大小写敏感,而在 Windows
中对大小写不敏感。一个显著的例外情况是 Mac OS X
,它基于 Unix
但使用默认文件系统类型(HFS+
),对大小写不敏感。然而,Mac OS X
也支持 UFS
卷,该卷对大小写敏感,就像 Unix
一样。
lower_case_file_system 参数(只读)
表示当前系统文件是否大小写敏感,只读参数,无法修改
。
- ON: 大小写不敏感
- OFF: 大小写敏感
lower_case_table_names 参数
Unix
下 lower_case_table_names
默认值为 0
;Windows
下默认值是 1
;Mac OS X
下默认值是 2
。
0
: 使用CREATE TABLE
或CREATE DATABASE
语句指定的大小写字母在硬盘上保存表名和数据库名。名称比较对大小写敏感
。在大小写不敏感的操作系统如Windows
或Mac OS x
上我们不能将该参数设为0
,如果在大小写不敏感的文件系统上将--lowercase-table-names
强制设为0
,并且使用不同的大小写访问MyISAM
表名,可能会导致索引破坏。1
: 表名在硬盘上以小写保存,名称比较对大小写不敏感
。MySQL
将所有表名转换为小写在存储和查找表上。该行为也适合数据库名和表的别名。该值为Windows
的默认值。2
: 表名和数据库名在硬盘上使用CREATE TABLE
或CREATE DATABASE
语句指定的大小写字母进行保存,但MySQL
将它们转换为小写在查找表上。名称比较对大小写不敏感,即按照大小写来保存,按照小写来比较。注释:只在对大小写不敏感的文件系统上适用!innodb
表名用小写保存。
由大小写敏感转换为不敏感方法
如果原来所建立库及表都是对大小写敏感的,想要转换为对大小写不敏感,主要需要进行如下3步:
- 将数据库数据通过
mysqldump
导出。 - 在
my.cnf
(CentOS
下配置文件是/etc/my.cnf
)中更改最后添加lower_case_tables_name = 1
,然后重启mysql
数据库 - 将导出的数据导入
mysql
数据库。
注:
MySQL 8.0
开始,禁止在重新启动MySQL
服务时将lower_case_table_names
设置 成不同于初始化MySQL
服务时设置的lower_case_table_names
值。该值只能在初始化MySQL
之前设置。
命名规则
为了避免大小写引发的问题,一种推荐的命名规则是:在定义数据库、表、列的时候全部采用小写字母加下划线的方式,不使用任何大写字母。
在任何系统中可以使用 lower_case_table_names=1
。使用该选项的不利之处是当使用 SHOW TABLES
或 SHOW DATABASES
时,看不出名字原来是用大写还是小写。
请注意在 Unix
中如果以前 lower_case_table_names = 0
,在将 lower_case_table_names
设置为 1
时,重启 mysqld
之前,必须先将旧的数据库名和表名转换为小写。
字段名大小写不敏感
数据库字段名,大小写不敏感
字段值大小写敏感设置,字符集和排序规则
字段值的大小写由 mysql 的校对规则来控制。提到校对规则,就不得不说字符集。字符集是一套符号和编码,校对规则是在字符集内用于比较字符的一套规则。
一般而言,校对规则以其相关的字符集名开始,通常包括一个语言名,并且以 _ci
(大小写不敏感)、_cs
(大小写敏感)或 _bin
(二元)结束 。比如 utf8
字符集,utf8_general_ci
表示不区分大小写,这个是 utf8
字符集默认的校对规则; utf8_general_cs
表示区分大小写,utf8_bin
表示二进制比较,同样也区分大小写 。
参考:
https://blog.csdn.net/lishuoboy/article/details/84562007
https://zhuanlan.zhihu.com/p/147720463