MySQL大小写敏感问题lower_case_table_names & lower_case_file_

关于MySQL大小写敏感问题lower_case_table_names & lower_case_file_system

〇 lower_case_file_system
该参数是用于描述data目录所在的操作系统是否为大小写敏感,该参数为bool类型,但无法修改。
0 — 大小写敏感
1 — 大小写不敏感

比如跑在linux上的都是OFF或者0。

〇 lower_case_table_names
该参数为静态,可设置为0、1、2。

0 — 大小写敏感。(Unix,Linux默认)
创建的库表将原样保存在磁盘上。如create database TeSt;将会创建一个TeSt的目录,create table AbCCC …将会原样生成AbCCC.frm。
SQL语句也会原样解析。

1 — 大小写不敏感。(Windows默认)
创建的库表时,MySQL将所有的库表名转换成小写存储在磁盘上。
SQL语句同样会将库表名转换成小写。
如需要查询以前创建的Test_table(生成Test_table.frm文件),即便执行select * from Test_table,也会被转换成select * from test_table,致使报错表不存在。

2 — 大小写不敏感(OS X默认)
创建的库表将原样保存在磁盘上。
但SQL语句将库表名转换成小写。

修改lower_case_table_names导致的常见不良隐患:
如果在lower_case_table_names=0时,创建了含有大写字母的库表,改为lower_case_table_names=1后,则会无法被查到。

注意事项:
将默认的lower_case_tables_name为0设置成1,需先将已经存在的库表名转换为小写

1)针对仅表名存在大写字母的情况:
①、lower_case_tables_name=0时,执行rename table成小写。
②、设置lower_case_tables_name=1,重启生效。

2)针对库名存在大写字母的情况:
①、lower_case_tables_name=0时,使用mysqldump导出,并删除老的数据库。
②、设置lower_case_tables_name=1,重启生效。
③、导入数据至实例,此时包含大写字母的库名已转换为小写。

那么问题来了,如何自动生成表名转换语句呢?

利用工具:EXCEl

第一步:
在Mysql客户端(此处用的是Heidisql)选中目标库,执行 show tables 列出所有的表。选中导出的表 执行右击导出 粘贴到 记事本中。

 

第二步:
放在记事本后后的样子是有双引号的,替换的时候把引号替换为空格,为什么要是空格 而不是什么都没有呢,后面会说。

 

第三步:
把替换好后的表粘贴到EXCEL 中,如下图补全 所需要的sql。

 
D列是怎么来的,用到了EXCEl 中的 UPPER() 函数。可以在excel中看下它的作用:
F列怎么来的是用到了 一个 CONCATENATE() 函数,具体怎么用,如下:
上面说过为什么 把 记事本中的 双引号替换为空格 而不是 什么都不写,是因为拼接后的 sql语句 就不会紧挨着了不然的话,sql 是这样的:

你认识,mysql 认识吗?

最后把生成的 F列粘贴到mysql客户端执行就好了 。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This blog is kept spam free by WP-SpamFree.