MySQL 預設在 Windows 不區分大小寫、Linux 區分。若需強制區分,需在 my.cnf [mysqld] 區段設定:
lower_case_table_names = 0 -- 0=區分大小寫, 1=不區分(預設 Windows), 2=存儲小寫但比較不區分
修改後必須重啟 MySQL 服務。
DROP PROCEDURE IF EXISTS uppercase_tables;
CREATE PROCEDURE uppercase_tables(IN dbname VARCHAR(200))
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE oldname VARCHAR(200);
DECLARE cur CURSOR FOR
SELECT table_name FROM information_schema.TABLES
WHERE table_schema = dbname;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
REPEAT
FETCH cur INTO oldname;
SET @newname = UPPER(oldname);
-- 二進位比較確保大小寫不同才重命名
SET @isNotSame = @newname <> BINARY oldname;
IF NOT done AND @isNotSame THEN
-- 兩步重命名避免大小寫衝突:先改臨時名,再改目標名
SET @SQL = CONCAT('RENAME TABLE `', oldname, '` TO `', LOWER(@newname), '_tmp`');
PREPARE tmpstmt FROM @SQL; EXECUTE tmpstmt;
SET @SQL = CONCAT('RENAME TABLE `', LOWER(@newname), '_tmp` TO `', @newname, '`');
PREPARE tmpstmt FROM @SQL; EXECUTE tmpstmt;
DEALLOCATE PREPARE tmpstmt;
END IF;
UNTIL done END REPEAT;
CLOSE cur;
END;
CALL uppercase_tables('your_database_name');
BINARY 比較確保 user vs USER 被視為不同RENAME 繞過檔案系統大小寫不敏感限制(先改小寫臨時名,再改大寫)information_schema.TABLES 獲取當前 schema 所有表SHOW TABLES; -- 應顯示全大寫表名