vlambda博客
学习文章列表

MySQL大小写敏感问题



1. MySQL大小写敏感配置

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

show global variables like '%lower_case%';
  • 1

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=0 (大小写敏感)
创建 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
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

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

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

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