用過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 // CREATE PROCEDURE renametables(olddb VARCHAR(50),newdb VARCHAR(50)) BEGIN DECLARE done BOOLEAN DEFAULT 0; DECLARE tmp VARCHAR(100); -- 定義局部變量 DECLARE tbcur CURSOR FOR SELECT TABLE_NAME FROM `information_schema`.`TABLES` WHERE table_schema=olddb AND Table_Type='BASE TABLE'; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; OPEN tbcur; -- 打開游標 REPEAT FETCH tbcur INTO tmp; IF done=0 THEN SET @sqlstring=CONCAT( 'RENAME TABLE ',olddb,'.`',tmp,'` TO ',newdb,'.`',LOWER(tmp),'`;'); SELECT @sqlstring; -- 這一句可以不要,只是打印我們拼接后要運行的SQL是什么 PREPARE s1 FROM @sqlstring; -- 執行拼接出來的SQL EXECUTE s1; DEALLOCATE PREPARE s1; END IF; UNTIL done END REPEAT; CLOSE tbcur; -- 關閉游標,釋放游標使用的所有內部內存和資源 END//
我們在新數據庫中建立了該存儲過程,然后調用即可:
CALL renametables('Test1','test1')
這樣所有Test1中的大小寫混合的表,就全部轉換到了test1數據庫中,而且表名都變成了小寫了。
一個一個的數據庫去這么做,然后再把MySQL的參數改為大小寫不敏感,這樣才能正常使用。
這里我只是做了表的遷移,接下來存儲過程和視圖的遷移,由於不涉及到數據,所以比較簡單,找到當年的DDL或者我們在大小寫敏感的時候就導出View和存儲過程的定義,然后用文本編輯器把整個SQL變成小寫的,然后到新數據庫中去執行,重新創建即可。