mysql 表名是否区分大小写配置
在 linux 环境下,mysql 默认表名是区分大小写的,我们可以查看全局变量发现:
mysql> show variables like 'lower%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_file_system | OFF |
| lower_case_table_names | 0 |
+------------------------+-------+
2 rows in set (0.00 sec)
lower_case_file_system 是一个只读参数,无法被修改,这个参数是用来告诉你在当前的系统平台下,是否对文件名大小写敏感。
lower_case_table_names: 此参数不可以动态修改,必须重启数据库
- lower_case_table_names=0 表名存储为给定的大小和比较是区分大小写的
- lower_case_table_names = 1 表名存储在磁盘是小写的,但是比较的时候是不区分大小写
- lower_case_table_names=2, 表名存储为给定的大小写但是比较的时候是小写的
当在表明区分大小写的清空下我们混用大小写是会报错的,如下:
mysql> show tables like 'black%';
+-------------------------+
| Tables_in_exam (black%) |
+-------------------------+
| black_unit |
| blacklist |
+-------------------------+
2 rows in set (0.00 sec)
mysql> select * from Blacklist;
ERROR 1146 (42S02): Table 'exam.Blacklist' doesn't exist
解决办法:
如果直接修改的话是会报错的,全局只读变量不可以修改。
mysql> set global lower_case_table_names=1;
ERROR 1238 (HY000): Variable 'lower_case_table_names' is a read only variable
最终解决办法:
- 修改 /etc/my.cnf, [mysqld] 下面加一行:
lower_case_table_names=1
如下:
[mysqld]
[client]
port = 3306
socket = /data/mysql/data/mysql.sock
[mysqld]
basedir = /opt/mysql
datadir = /data/mysql/data
pid-file = /data/mysql/data/mysql.pid
max_connections = 1000
max_connect_errors = 1000
table_open_cache = 1024
max_allowed_packet = 128M
open_files_limit = 65535
lower_case_table_names=1
2. 重启 mysql 服务并且查看全局变量的值
mysql> show variables like 'lower%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_file_system | OFF |
| lower_case_table_names | 1 |
+------------------------+-------+
2 rows in set (0.00 sec)
3. 再次验证是否区分大小写:
mysql> select * from BLACKLIST;
Empty set (0.00 sec)
至此配置成功!