mysql大小写敏感配置

1.mysql大小写敏感配置

mysql大小写敏感配置相关的两个参数,lower_case_file_systemlower_case_table_names

查看当前mysql的大小写敏感配置

show global variables like '%lower_case%';

+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | ON    |
| lower_case_table_names | 0     |
+------------------------+-------+
lower_case_file_system

表示当前系统文件是否大小写敏感,只读参数,无法修改。

ON  大小写不敏感
OFF 大小写敏感
 

lower_case_table_names

表示表名是否大小写敏感,可以修改。

lower_case_table_names = 0时,mysql会根据表名直接操作,大小写敏感。
lower_case_table_names = 1时,mysql会先把表名转为小写,再执行操作。
 

设置lower_case_table_names的值

打开my.cnf文件,加入以下语句后重启。

lower_case_table_names = 0 或 lower_case_table_names = 1


2.测试lower_case_table_names为0和1时的不同情况

创建表 user

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

1.设置lower_case_table_names = 0

表名与创建时大小写一致

select count(*) from user;
+----------+
| count(*) |
+----------+
|        0 |
+----------+

表名与创建时大小写不一致

select count(*) from User;
ERROR 1146 (42S02): Table 'user.User' doesn't exist

lower_case_table_names=0时,表名大小写敏感。
 

2.设置lower_case_table_names = 1

表名与创建时大小写一致

select count(*) from user;
+----------+
| count(*) |
+----------+
|        0 |
+----------+

表名与创建时大小写不一致

select count(*) from User;
+----------+
| count(*) |
+----------+
|        0 |
+----------+

lower_case_table_names=1时,表名大小写不敏感。
 

3.设置lower_case_table_names=1时,原来在lower_case_table_names=0时创建的表提示不存在的解决方法

lower_case_table_names=0时使用大小写混用创建表名,再设置lower_case_table_names=1后,原创建的表使用时会提示不存在。
 

演示

首先设置lower_case_table_names=0

创建表 User(大小写混用)

CREATE TABLE `User` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

show tables;
+----------------+
| Tables_in_user |
+----------------+
| User           |
+----------------+

再设置lower_case_table_names=1

执行查询,不管表名是大写还是小写,都提示表不存在

select * from User;
ERROR 1146 (42S02): Table 'user.user' doesn't exist

select * from user;
ERROR 1146 (42S02): Table 'user.user' doesn't exist

select * from USER;
ERROR 1146 (42S02): Table 'user.user' doesn't exist

因为lower_case_table_names=1时,会先把表名转为小写后再操作,而文件中根本不存在小写的表名文件,因此出错。
 

解决方法:

如果要将lower_case_table_names从0修改为1时,应先对旧数据表的表名进行处理,把所有数据库的表名先改为小写,最后再设置lower_case_table_names为1,否则会出现上述的问题。
 

总结:
操作系统不同导致大小写敏感不一致。我们在开发时,应该按大小写敏感的原则去开发,这样可以使开发的程序兼容不同的操作系统。因此,建议在开发测试环境下把lower_case_table_names的值设为0,便于在开发中就严格控制代码大小写敏感,提高代码的兼容和严谨。

<think> 嗯,用户需要了解MySQL 8中配置大小写敏感的方法。根据系统要求,我需要使用正确的LaTeX格式,并且用中文回答。让我仔细分析一下用户提供的四个引用内容。 从引用[1][2][3][4]来看,核心要点是MySQL 8必须在初始化时设置大小写敏感参数,这个参数不能后期修改,否则会导致服务启动失败。引用[1]和[3]特别强调了这一点,引用[2]和[4]则提到了备份和配置文件修改的步骤。 用户真正的需求应该是安全地配置大小写敏感,避免数据丢失。考虑到MySQL 8的特殊性,我需要重点强调初始化前设置和备份的重要性。引用[3]提到"未安装MySQL8的修改步骤"和"已安装的修改步骤"的区别,这个信息特别重要。 在准备回答时,应该分成两种情况:新安装和已安装。对于已安装的情况,必须包含数据备份、删除数据目录、修改配置、重新初始化等关键步骤。每个步骤都要明确操作指令,比如停止服务的命令、初始化命令等。 引用[2]和[3]中关于cp -r data/的备份操作很实用,应该包含。同时要提醒用户注意配置文件的位置差异(CentOS vs Ubuntu),这点在引用[4]中有说明。 需要特别注意的危险点是:如果用户跳过备份步骤直接操作,可能导致数据永久丢失。这个风险要在回答中明确警告。另外,lower_case_table_names的值必须在初始化时确定且保持一致的规则也要强调。 最后生成相关问题时,可以围绕配置差异、数据迁移、只读操作等方向设计,帮助用户延伸理解。 </think> 在MySQL 8中配置大小写敏感(`lower_case_table_names=1`)**必须在初始化(首次启动)前完成**,且**修改现有实例需要重建数据目录**。核心步骤如下: ### 📌 一、全新安装MySQL 8(未初始化) 1. **修改配置文件** 编辑MySQL配置文件(位置因系统而异): ```bash # CentOS/RHEL sudo vi /etc/my.cnf # Ubuntu/Debian sudo vi /etc/mysql/my.cnf ``` 在 `[mysqld]` 部分添加: ```ini [mysqld] lower_case_table_names=1 ``` 2. **初始化MySQL** 执行初始化命令(确保 `datadir` 为空): ```bash bin/mysqld --initialize --user=mysql --lower-case-table-names=1 --basedir=/path/to/mysql --datadir=/path/to/mysql/data ``` > 💡 关键点:`--lower-case-table-names=1` 必须在初始化时显式指定[^1][^3]。 3. **启动服务并赋权** ```bash chown -R mysql:mysql /path/to/mysql/data systemctl start mysqld ``` --- ### ⚠️ 二、已安装MySQL 8(需重建数据) **警告:此操作会删除所有数据!必须先完整备份!** 1. **停止服务 & 备份数据** ```bash systemctl stop mysqld cp -rp /var/lib/mysql /backup/mysql_data # 完整备份原数据[^2][^3] ``` 2. **删除数据目录** ```bash rm -rf /var/lib/mysql # 默认路径,按实际配置调整 ``` 3. **修改配置文件** 同上述步骤,在 `my.cnf` 的 `[mysqld]` 部分添加: ```ini lower_case_table_names=1 ``` 4. **重新初始化** ```bash bin/mysqld --initialize --user=mysql --lower-case-table-names=1 --basedir=/path/to/mysql --datadir=/var/lib/mysql ``` 5. **赋权 & 启动服务** ```bash chown -R mysql:mysql /var/lib/mysql systemctl start mysqld ``` > ⚠️ 初始化后会生成临时密码,使用 `grep 'temporary password' /var/log/mysqld.log` 查看[^2]。 --- ### 🔍 关键注意事项 1. **初始化时机** `lower_case_table_names` 的值必须在**首次初始化前确定**,后期修改需重建数据[^1][^3]。 2. **配置一致性** 启动服务的配置必须与初始化时的参数完全一致,否则服务无法启动[^3]。 3. **操作系统影响** Linux默认大小写敏感,Windows默认不敏感。跨平台迁移时需确保参数一致[^4]。 --- ###
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值