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


95

有一个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 charset将此表的更改latin1utf8。怎么做 ?


3
MySQL中“ UTF8”的正确名称是“ utf8mb4”,字符集“ utf8”已损坏,它最多支持3个字节的字符。有关详细信息,请参见mysql手册,或查看google“ mysql”和“ utf8” ... dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html
SamuelÅslund18年

Answers:


201

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

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

因此查询将是:

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;

22
相比之下,如果仅使用ALTER TABLE tbl CHARACTER SET utf8其他人建议的语法,则仅更改表的默认编码;否则,仅更改表的默认编码。如果使用此答案,现有列将不会转换。
eaj 2014年

7
如果要对数据库中未使用ut8编码的所有表应用此更改,则可以使用此查询并执行结果查询: SELECT concat('alter table ', table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') FROM information_schema.tables WHERE table_schema='<your_database_name>' and table_collation != 'utf8_general_ci' GROUP BY table_name;
Maxooo 2014年

3
这不会更改默认字符集。更改默认操作,如eak所说ALTER TABLE tbl CHARACTER SET utf8
会计م

7
我想补充一点,通常您不想使用utf8,而是使用utf8mb4来获得您可能期望的utf8。解释一下:在MySQL中,utf8实际上只是utf8的一个子集,最好将其命名为utf8mb3。它最多只能编码3个字节的utf8字符,而不是指定的4个字节。这意味着,如果您尝试将它们写入数据库,则许多表情符号将无法编码,而只会丢失。参见例如。medium.com/@adamhooper/…了解详情。
载重吨

6
对于多字节,您可以使用ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
RN Kushwaha

18

更改表的默认字符集:

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;

10
您永远都不要使用utf8_general_ci:这根本行不通。这可以追溯到50年前的ASCII加密的糟糕历史。如果没有UCD的折叠大小写映射,则Unicode区分大小写的匹配将无法完成。例如,“Σίσυφος”中包含三个不同的sigma。或者“TSCHüẞ”的小写字母是“tschüβ”,而“tschüβ”的大写字母是“TSCHÜSS”。您可能是正确的,也可以是快速的。因此,您必须使用utf8_unicode_ci,因为如果您不关心正确性,那么使其无限快速变得很简单。
Yohanes AI '04

1
MySQL UTF8字符集已损坏,您需要使用utf8mb4!
塞缪尔·奥斯隆德18/12/17

5

ALTER TABLEMySQL命令应该做的伎俩。以下命令将表的默认字符集及其所有列的字符集更改为UTF8。

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

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

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


1
是的,它确实可以解决问题,但是转换为方式有一点不同:它不能自动从列中删除旧的字符集选项。
tech_me 2014年

3

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

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`;

缺少条件导致我们也选择视图。在哪里table_schema = DATABASE(); => WHERE table_schema = DATABASE()AND table_type ='BASE TABLE'; 但是谢谢!这就是我所需要的!
nguyenhoai890 '19

2

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

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


如果不是iPod touch上的有限键盘,我会::)
Joni

iPod Touch / iPhone 必须具有一些缺点。:-P在您提到之前,他们从未意识到他们不见了。;-)
Aufwind 2012年

按住引号字符的按钮即可查看反引号字符。
Chloe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.