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

phe*_*mix 83 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  
Run Code Online (Sandbox Code Playgroud)

我想default charset将此表的更改latin1utf8.怎么做 ?

小智 182

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

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
Run Code Online (Sandbox Code Playgroud)

所以查询将是:

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;
Run Code Online (Sandbox Code Playgroud)

  • 相比之下,如果您只是使用其他人建议的`ALTER TABLE tbl CHARACTER SET utf8`语法,您将只更改表的默认编码; 如果您使用此答案,则不会按原样转换现有列. (18认同)
  • 如果要对数据库中未在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>'和table_collat​​ion!='utf8_general_ci'GROUP BY table_name;` (6认同)
  • 我想补充一点,通常你不想使用utf8而是使用utf8mb4来获得你可能期望的utf8.要解释一下:在MySQL中,utf8实际上只是utf8的一个子集,更好的名称是utf8mb3.它最多只能编码3个字节的utf8字符,而不是最多4个字节.这意味着许多表情符号将无法编码,如果您尝试将其写入数据库,则会丢失.见例如.https://medium.com/@adamhooper/in-mysql-never-use-utf8-use-utf8mb4-11761243e434了解详情. (6认同)
  • 对于多字节,您可以使用`ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;` (6认同)
  • 这不是改变**默认**字符集.更改默认值为eak表示`ALTER TABLE tbl CHARACTER SET utf8` (2认同)

Dev*_*art 18

更改表的默认字符集:

ALTER TABLE etape_prospection
  CHARACTER SET utf8,
  COLLATE utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)

要更改字符串列charset,请更改此查询:

ALTER TABLE etape_prospection
  CHANGE COLUMN etape_prosp_comment etape_prosp_comment TEXT CHARACTER SET utf8 COLLATE utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)

  • 你永远不应该使用utf8_general_ci:它根本不起作用.这是对五十年前ASCII stooopeeedity过去的糟糕历史的回顾.如果没有UCD的折叠映射,则无法进行Unicode不区分大小写的匹配.例如,"Σίσυφος"中有三个不同的sigma; 或者"TSCHüẞ"的小写字母是如何"tschüβ",但"tschüβ"的大写字母是"TSCHÜSS".你可以是对的,或者你可以快.因此,你必须使用utf8_unicode_ci,因为如果你不关心正确性,那么让它无限快速是微不足道的. (8认同)
  • MySQL UTF8 字符集已损坏,您需要使用 utf8mb4 ! (3认同)

pie*_*ian 8

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

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)

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

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


mil*_*jan 6

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

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 ;
Run Code Online (Sandbox Code Playgroud)

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

SOURCE ~/path-to-the-file/chg_char_set.sql
Run Code Online (Sandbox Code Playgroud)

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

CALL change_character_set('utf8mb4', 'utf8mb4_bin');
Run Code Online (Sandbox Code Playgroud)

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

DROP PROCEDURE `change_character_set`;
DROP PROCEDURE `exec_query`;
Run Code Online (Sandbox Code Playgroud)