如何更改 MySQL 表的默认字符集?

有一个 MySQL table,它的定义取自 SQLYog Enterprise:

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

我想把这个表的 default charsetlatin1改成 utf8。怎么做?

168629 次浏览

使用 ALTER TABLE MySQL 命令就可以了。下面的命令将表的默认字符集及其所有列的字符集更改为 UTF8。

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

此命令将表中所有类似文本的列转换为新的字符集。每个字符集使用不同数量的数据,因此 MySQL 将转换一些列的类型,以确保有足够的空间来容纳与旧列类型相同数量的字符。

我建议您在修改任何实时数据之前先阅读 MySQL 文档

更改表的默认字符集:

ALTER TABLE etape_prospection
CHARACTER SET utf8,
COLLATE utf8_general_ci;

若要更改字符串列字符集,请执行此查询:

ALTER TABLE etape_prospection
CHANGE COLUMN etape_prosp_comment etape_prosp_comment TEXT CHARACTER SET utf8 COLLATE utf8_general_ci;

您可以使用 alter table set default charset更改默认值,但这不会更改现有列的字符集。要改变这一点,需要使用 alter table modify column

更改列的字符集只意味着它将能够存储更大范围的字符。您的应用程序使用 mysql 客户机与 db 交谈,因此您可能还需要更改客户机编码。

如果希望将表 default character set和所有字符列更改为新的字符集,请使用如下语句:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

因此,查询将是:

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;

如果有人正在寻找更改所有数据库表的默认字符集并转换数据的完整解决方案,这可能是其中之一:

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 ;

你可以把这段代码放在文件中,比如 chg_char_set.sql,然后执行它,比如从 MySQL 终端调用它:

SOURCE ~/path-to-the-file/chg_char_set.sql

然后使用所需的输入参数调用已定义的过程。

CALL change_character_set('utf8mb4', 'utf8mb4_bin');

一旦测试了结果,就可以删除这些存储过程:

DROP PROCEDURE `change_character_set`;
DROP PROCEDURE `exec_query`;