我想创建一个过程,将指定数据库和特定引擎中的所有表转换为不同的引擎。
这就是我所拥有的:
DELIMITER //
DROP PROCEDURE IF EXISTS CONVERT_TABLES //
CREATE PROCEDURE CONVERT_TABLES
(
IN db_name CHAR(255),
IN engine_from CHAR(255),
IN engine_to CHAR(255)
)
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE table_name CHAR(255);
DECLARE db_tables CURSOR FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = db_name COLLATE utf8_unicode_ci AND ENGINE = engine_from COLLATE utf8_unicode_ci;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN db_tables;
loop_tables: LOOP
FETCH db_tables INTO table_name;
IF done THEN
LEAVE loop_tables;
END IF;
SET @sql = CONCAT('ALTER TABLE ', db_name, '.', table_name, ' ENGINE = ', engine_to );
PREPARE stmt FROM @sql;
EXECUTE stmt;
DROP PREPARE stmt;
END LOOP;
END //
DELIMITER;
CALL CONVERT_TABLES( "dp_dev_web7", "MyISAM", "InnoDB" );
但是我收到了这个错误:
1064 - 您的SQL语法出错;检查与您的MySQL服务器版本相对应的手册,以获得正确的语法,以便在' NULL'附近使用在第1行
//编辑:修复了整理错误,更新了代码
答案 0 :(得分:1)
看起来你正在比较不同排序规则的字符串。修复您需要更改数据库结构中的排序规则或使用COLLATE
动态更改它:
WHERE TABLE_SCHEMA COLLATE utf8_general_ci = IFNULL(db_name,"") COLLATE utf8_general_ci AND ENGINE COLLATE utf8_general_ci = IFNULL(engine_from,"") COLLATE utf8_general_ci