將現有MySQL數據庫改為大小寫不敏感


用過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變成小寫的,然后到新數據庫中去執行,重新創建即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM