MySQL修改列字符集:如何保留原有属性不丢失?
将MySQL字符集从utf8mb3转为utf8mb4的相关问题
背景
已知在MySQL中,若表结构如下:
CREATE TABLE foo ( name VARCHAR(100) DEFAULT 'Test' NOT NULL COMMENT 'Default name is Test' );
执行仅指定字符集的修改语句:
ALTER TABLE `company_db`.`foo` MODIFY COLUMN `name` VARCHAR(100) CHARACTER SET utf8mb4;
会丢失NOT NULL、COMMENT、DEFAULT值等原有属性,因为命令中未明确指定这些属性。
自定义脚本的有效性与属性遗漏检查
我编写了以下脚本,用于批量将所有utf8mb3的字符型列转为utf8mb4,测试过可用,但担心遗漏未知属性,请问该脚本能否确保不丢失任何属性?是否还有遗漏的属性?
SELECT CONCAT( 'ALTER TABLE `', C.TABLE_SCHEMA, '`.`', C.TABLE_NAME, '` ', 'MODIFY COLUMN `', C.COLUMN_NAME, '` ', C.COLUMN_TYPE, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci', -- Nullability IF(C.IS_NULLABLE = 'NO', ' NOT NULL', ' NULL'), -- Default Value IF( C.COLUMN_DEFAULT IS NOT NULL, CONCAT(' DEFAULT ', QUOTE(C.COLUMN_DEFAULT)), IF(C.IS_NULLABLE = 'YES', ' DEFAULT NULL', '') ), -- Extra attributes IF(LOCATE('auto_increment', C.EXTRA) > 0, ' AUTO_INCREMENT', ''), IF(LOCATE('on update', C.EXTRA) > 0, CONCAT(' ', C.EXTRA), ''), -- Column comment IF(C.COLUMN_COMMENT != '', CONCAT(' COMMENT ', QUOTE(C.COLUMN_COMMENT)), ''), ';' ) AS alter_statement FROM information_schema.COLUMNS C JOIN information_schema.TABLES T ON C.TABLE_SCHEMA = T.TABLE_SCHEMA AND C.TABLE_NAME = T.TABLE_NAME WHERE C.CHARACTER_SET_NAME = 'utf8' AND T.TABLE_TYPE = 'BASE TABLE' AND C.TABLE_SCHEMA NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys') AND C.DATA_TYPE IN ('char', 'varchar', 'text', 'tinytext', 'mediumtext', 'longtext') ORDER BY C.TABLE_SCHEMA, C.TABLE_NAME, C.ORDINAL_POSITION;
直接修改数据库/表字符集的可行性
另外,仅执行以下语句修改数据库或表是否可行?是否也会丢失原有属性?
修改数据库字符集:
ALTER DATABASE xxx CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
修改表字符集:
ALTER TABLE xxxx CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
内容的提问来源于stack exchange,提问作者Astora
相关产品推荐
相关产品推荐

