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

时间:2012-01-18 07:48:22

标签: mysql sqlyog

有一个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。怎么做?

5 个答案:

答案 0 :(得分:171)

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

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

所以查询将是:

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;

答案 1 :(得分:17)

更改表格默认字符集:

ALTER TABLE etape_prospection
  CHARACTER SET utf8,
  COLLATE utf8_general_ci;

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

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

答案 2 :(得分:4)

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

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

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

我建议您在修改任何实时数据之前阅读ALTER TABLE MySQL documentation

答案 3 :(得分:2)

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

更改列的字符集只意味着它可以存储更广泛的字符。您的应用程序使用mysql客户端与数据库进行通信,因此您可能还需要更改客户端编码。

答案 4 :(得分:0)

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

DELIMITER $$

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();
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;
SET @alter = concat('ALTER TABLE ', tab_name,
                    ' CONVERT TO CHARACTER SET ', charset,
                    ' COLLATE ', collation , ';');
SELECT @alter;
PREPARE stmt FROM @alter;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP change_loop;
CLOSE charset_cursor;
SET foreign_key_checks = 1;
END$$

DELIMITER ;

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

mysql> source ~/path-to-the-file/chg_char_set.sql

然后使用所需的输入参数(例如,

)调用定义的过程
mysql> change_character_set('utf8mb4', 'utf8mb4_general_ci');