How to change the default charset of a MySQL table?
有一个MySQL
1 2 3 4 5 6 7 8 9 10 11 12 | Table Create Table ----------------- --------------------------------------------------------- etape_prospection CREATE TABLE `etape_prospection` ( `etape_prosp_id` int(10) NOT NULL AUTO_INCREMENT, `type_prosp_id` int(10) NOT NULL DEFAULT '0', `prosp_id` int(10) NOT NULL DEFAULT '0', `etape_prosp_date` datetime DEFAULT NULL, `etape_prosp_comment` text, PRIMARY KEY (`etape_prosp_id`), KEY `concerne_fk` (`prosp_id`), KEY `de_type_fk` (`type_prosp_id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 |
我想将此表的
如果要将表
因此查询将是:
更改表的默认字符集:
要更改字符串列字符集,请执行以下查询:
1 2 |
此命令会将表中所有类似文本的列转换为新的字符集。字符集每个字符使用不同数量的数据,因此MySQL将转换某些列的类型,以确保有足够的空间容纳与旧列类型相同数量的字符。
我建议您在修改任何实时数据之前先阅读ALTER TABLE MySQL文档。
如果有人正在寻找一种完整的解决方案,以更改所有数据库表的默认字符集并转换数据,则可以是以下一种方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | DELIMITER $$ CREATE PROCEDURE `exec_query`(IN sql_text VARCHAR(255)) BEGIN SET @tquery = `sql_text`; PREPARE `stmt` FROM @tquery; EXECUTE `stmt`; DEALLOCATE PREPARE `stmt`; END$$ CREATE PROCEDURE `change_character_set`(IN `charset` VARCHAR(64), IN `collation` VARCHAR(64)) BEGIN DECLARE `done` BOOLEAN DEFAULT FALSE; DECLARE `tab_name` VARCHAR(64); DECLARE `charset_cursor` CURSOR FOR SELECT `table_name` FROM `information_schema`.`tables` WHERE `table_schema` = DATABASE() AND `table_type` = 'BASE TABLE'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET `done` = TRUE; SET foreign_key_checks = 0; OPEN `charset_cursor`; `change_loop`: LOOP FETCH `charset_cursor` INTO `tab_name`; IF `done` THEN LEAVE `change_loop`; END IF; CALL `exec_query`(CONCAT( 'ALTER TABLE `', tab_name, '` CONVERT TO CHARACTER SET ', QUOTE(charset), ' COLLATE ', QUOTE(collation), ';' )); CALL `exec_query`(CONCAT('REPAIR TABLE `', tab_name, '`;')); CALL `exec_query`(CONCAT('OPTIMIZE TABLE `', tab_name, '`;')); END LOOP `change_loop`; CLOSE `charset_cursor`; SET foreign_key_checks = 1; END$$ DELIMITER ; |
您可以将此代码放在文件中,例如
1 | SOURCE ~/path-to-the-file/chg_char_set.sql |
然后使用所需的输入参数调用已定义的过程,例如
1 |
测试结果后,可以删除这些存储过程:
您可以使用
更改列的字符集仅意味着它将能够存储更大范围的字符。您的应用程序使用mysql客户端与db通信,因此您可能还需要更改客户端编码。