用过MySQL的应该都会注意到,默认情况下,Linux下安装的MySQL是大小写敏感的,也就是说Table1和table1可以同时存在。而Windows下的MySQL却是大小写不敏感的,所有表名和数据库名都会变成小写。
对于怎么启用或者停用MySQL数据库的大小写敏感,这个网上随便都能找到,就是改改参数lower_case_table_names,然后重启即可。
但是,如果我们的数据库中已经有了多个区分大小写的数据库,现在要改为不区分大小写的,那么就会报错:Table 'databasenamexxx.tablenamexxx' doesn't exist.
为此,我们需要将MySQL改为大小写敏感的模式,然后去重命名每个表名和数据库名。
MySQL确实很神奇的一点是不允许重命名数据库,所以如果我们要重命名Test1为test1,那么只有新建一个test1的数据库,然后把Test1中的表全面rename到test1数据库中。
而且在rename的过程中,我们也需要将表面从大小写的形式改为全部小写的形式。
为了批量的做这么一件事,与,我写了一个存储过程,通过读取系统表,获得数据库表名,然后用游标的方式依次执行rename操作。
DELIMITER
<span style="color: #0000ff;">CREATE <span style="color: #0000ff;">PROCEDURE renametables(olddb <span style="color: #0000ff;">VARCHAR(<span style="color: #800000; font-weight: bold;">50),newdb <span style="color: #0000ff;">VARCHAR(<span style="color: #800000; font-weight: bold;">50<span style="color: #000000;">))
<span style="color: #0000ff;">BEGIN
<span style="color: #0000ff;">DECLARE done BOOLEAN <span style="color: #0000ff;">DEFAULT <span style="color: #800000; font-weight: bold;">0<span style="color: #000000;">;
<span style="color: #0000ff;">DECLARE tmp <span style="color: #0000ff;">VARCHAR(<span style="color: #800000; font-weight: bold;">100); <span style="color: #008080;">--<span style="color: #008080;"> 定义局部变量
<span style="color: #0000ff;">DECLARE tbcur <span style="color: #0000ff;">CURSOR
<span style="color: #0000ff;">FOR <span style="color: #0000ff;">SELECT TABLE_NAME <span style="color: #0000ff;">FROM information_schema
.TABLES
<span style="color: #0000ff;">WHERE table_schema<span style="color: #808080;">=olddb <span style="color: #808080;">AND Table_Type<span style="color: #808080;">=<span style="color: #ff0000;">'<span style="color: #ff0000;">BASE TABLE<span style="color: #ff0000;">'<span style="color: #000000;">;
<span style="color: #0000ff;">DECLARE <span style="color: #0000ff;">CONTINUE HANDLER <span style="color: #0000ff;">FOR SQLSTATE <span style="color: #ff0000;">'<span style="color: #ff0000;">02000<span style="color: #ff0000;">' <span style="color: #0000ff;">SET done <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">1<span style="color: #000000;">;
<span style="color: #0000ff;">OPEN tbcur; <span style="color: #008080;">--<span style="color: #008080;"> 打开游标
<span style="color: #000000;">
REPEAT
<span style="color: #0000ff;">FETCH tbcur <span style="color: #0000ff;">INTO<span style="color: #000000;"> tmp;
<span style="color: #0000ff;">IF done<span style="color: #808080;">=<span style="color: #800000; font-weight: bold;">0
<span style="color: #0000ff;">THEN
<span style="color: #0000ff;">SET <span style="color: #008000;">@sqlstring<span style="color: #808080;">=CONCAT( <span style="color: #ff0000;">'<span style="color: #ff0000;">RENAME TABLE <span style="color: #ff0000;">',olddb,<span style="color: #ff0000;">'<span style="color: #ff0000;">.</span><span style="color: #ff0000;">'</span>,tmp,<span style="color: #ff0000;">'</span><span style="color: #ff0000;">
TO <span style="color: #ff0000;">',newdb,<span style="color: #ff00ff;">LOWER(tmp),<span style="color: #ff0000;">'<span style="color: #ff0000;">`;<span style="color: #ff0000;">'<span style="color: #000000;">);
<span style="color: #0000ff;">SELECT <span style="color: #008000;">@sqlstring<span style="color: #000000;">; -- 这一句可以不要,只是打印我们拼接后要运行的SQL是什么
<span style="color: #0000ff;">PREPARE s1 <span style="color: #0000ff;">FROM <span style="color: #008000;">@sqlstring; <span style="color: #008080;">--<span style="color: #008080;"> 执行拼接出来的SQL
<span style="color: #0000ff;">EXECUTE<span style="color: #000000;"> s1;
<span style="color: #0000ff;"> DEALLOCATE <span style="color: #0000ff;">PREPARE<span style="color: #000000;"> s1;
<span style="color: #0000ff;"> END <span style="color: #0000ff;">IF<span style="color: #000000;">;
UNTIL done <span style="color: #0000ff;">END<span style="color: #000000;"> REPEAT;
<span style="color: #0000ff;">CLOSE tbcur; <span style="color: #008080;">--<span style="color: #008080;"> 关闭游标,释放游标使用的所有内部内存和资源
<span style="color: #0000ff;">END</span><span style="color: #808080;">//</span> </pre>
我们在新数据库中建立了该存储过程,然后调用即可:
CALL renametables(,)
这样所有Test1中的大小写混合的表,就全部转换到了test1数据库中,而且表名都变成了小写了。
一个一个的数据库去这么做,然后再把MySQL的参数改为大小写不敏感,这样才能正常使用。
这里我只是做了表的迁移,接下来存储过程和视图的迁移,由于不涉及到数据,所以比较简单,找到当年的DDL或者我们在大小写敏感的时候就导出View和存储过程的定义,然后用文本编辑器把整个SQL变成小写的,然后到新数据库中去执行,重新创建即可。