lower_case_table_names与表格名称大小写的问题

本文详细解析了MySQL在不同操作系统下对数据库名、表名和列名的大小写敏感性差异,包括Unix、Windows和MacOSX的具体表现,以及如何通过调整lower_case_table_names参数实现大小写敏感性的转换。

1 简介
在MySQL中,数据库对应数据目录中的目录。数据库中的每个表至少对应数据库目录中的一个文件(也可能是多个,取决于存储引擎)。因此,所使用操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。
在大多数Unix中数据库名和表名对大小写敏感,而在Windows中对大小写不敏感。一个显著的例外情况是Mac OS X,它基于Unix但使用默认文件系统类型(HFS+),对大小写不敏感。然而,Mac OS X也支持UFS卷,该卷对大小写敏感,就像Unix一样。
变量lower_case_file_system说明是否数据目录所在的文件系统对文件名的大小写敏感。ON说明对文件名的大小写不敏感,OFF表示敏感。
例如在windows下查看:

说明windows系统对大小写不敏感,mysql也默认设置为对大小写不敏感。

2 大小写区分规则
linux下:
数据库名与表名是严格区分大小写的;
表的别名是严格区分大小写的;
列名与列的别名在所有的情况下均是忽略大小写的;
变量名也是严格区分大小写的;
windows下:
都不区分大小写
Mac OS下(非UFS卷):
都不区分大小写

3 参数说明(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表名用小写保存。
4 由大小写敏感转换为不敏感方法
如果原来所建立库及表都是对大小写敏感的,想要转换为对大小写不敏感,主要需要进行如下3步:
1.将数据库数据通过mysqldump导出。
2.在my.cnf中更改lower_case_tables_name = 1,并重启mysql数据库。
3.将导出的数据导入mysql数据库。

5 注意事项
为了避免大小写引发的问题,一种推荐的命名规则是:在定义数据库、表、列的时候全部采用小写字母加下划线的方式,不使用任何大写字母
在任何系统中可以使用lower_case_tables_name=1。使用该选项的不利之处是当使用SHOW TABLES或SHOW DATABASES时,看不出名字原来是用大写还是小写。
请注意在Unix中如果以前lower_case_tables_name = 0将lower_case_tables_name设置为1之前,重启mysqld之前,必须先将旧的数据库名和表名转换为小写。


原文地址:http://blog.youkuaiyun.com/jesseyoung/article/details/40617031
博客主页:http://blog.youkuaiyun.com/jesseyoung

### 更改 `lower_case_table_names` 参数的设置 在 MySQL 或 MariaDB 中,`lower_case_table_names` 参数用于控制数据库和表名的大小写敏感性。更改此参数需要遵循特定步骤,以确保数据库的正常运行并避免潜在问题。 #### 1. 确认当前配置 首先,检查当前的 `lower_case_table_names` 设置值。可以通过查询系统变量来实现: ```sql SHOW VARIABLES LIKE 'lower_case_table_names'; ``` 此命令将返回一个值(0、1 或 2),表示当前的大小写敏感性设置[^4]。 #### 2. 修改配置文件 根据操作系统和安装方式,找到正确的 MySQL 或 MariaDB 配置文件。通常,这些文件位于以下路径之一: - `/etc/my.cnf` - `/etc/mysql/my.cnf` - `/usr/local/mysql/my.cnf` 在配置文件中,找到或添加 `[mysqld]` 部分,并设置 `lower_case_table_names` 参数。例如: ```ini [mysqld] lower_case_table_names = 1 ``` 此处的值可以是: - `0`:大小写敏感。 - `1`:大小写不敏感,所有表名存储为小写。 - `2`:表名存储为给定的大小写,但比较时转换为小写[^5]。 #### 3. 处理现有数据 如果数据库中已经存在表,直接更改 `lower_case_table_names` 参数可能导致问题。因此,在修改此参数之前,必须先将所有表名转换为小写。可以使用以下 SQL 脚本完成此操作: ```sql SELECT CONCAT('RENAME TABLE ', table_name, ' TO ', LOWER(table_name), ';') FROM information_schema.tables WHERE table_schema = 'your_database_name' AND table_name != LOWER(table_name); ``` 将生成的 `RENAME TABLE` 语句执行以重命名所有非小写的表名[^1]。 #### 4. 重启服务 修改配置文件后,必须重启 MySQL 或 MariaDB 服务以使更改生效。使用以下命令重启服务: ```bash sudo systemctl restart mysql # 或者对于 MariaDB sudo systemctl restart mariadb ``` #### 5. 验证更改 重启服务后,再次运行以下命令以确认更改已生效: ```sql SHOW VARIABLES LIKE 'lower_case_table_names'; ``` #### 注意事项 - 如果在第一次启动 MySQL 或 MariaDB 后才添加 `lower_case_table_names` 参数,可能会导致服务无法启动。因此,建议在初次安装时就正确配置该参数[^2]。 - 在某些情况下,配置文件可能被设置为只读,或者由于权限问题,更改未被保存。请确保对配置文件具有写入权限[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值