关于sqlyog:如何更改MySQL表的默认字符集?

How to change the default charset of a MySQL table?

有一个MySQL table,其定义来自SQLYog Enterprise

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

我想将此表的default charsetlatin1更改为utf8。 怎么做 ?


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

1
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

因此查询将是:

1
ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;


更改表的默认字符集:

1
2
3
ALTER TABLE etape_prospection
  CHARACTER SET utf8,
  COLLATE utf8_general_ci;

要更改字符串列字符集,请执行以下查询:

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


ALTER TABLE MySQL命令应该可以解决问题。以下命令将表的默认字符集及其所有列的字符集更改为UTF8。

1
ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

此命令会将表中所有类似文本的列转换为新的字符集。字符集每个字符使用不同数量的数据,因此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 ;

您可以将此代码放在文件中,例如chg_char_set.sql并执行它,例如通过从MySQL终端调用它:

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

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

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

测试结果后,可以删除这些存储过程:

1
2
DROP PROCEDURE `change_character_set`;
DROP PROCEDURE `exec_query`;


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

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