Como alterar o conjunto de caracteres padrão de uma tabela MySQL?

96

Existe um MySQL tableque tem esta definição tirada de 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  

Eu quero mudar o default charsetdesta tabela de latin1para utf8. Como fazer isso ?

feromix
fonte
3
O nome correto para "UTF8" no MySQL é "utf8mb4" o conjunto de caracteres "utf8" está quebrado, ele suporta apenas até 3 caracteres de byte. Consulte o manual do mysql para obter detalhes ou google "mysql" e "utf8" ... dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html
Samuel Åslund

Respostas:

202

Se você quiser alterar a tabela default character sete todas as colunas de caracteres para um novo conjunto de caracteres, use uma instrução como esta:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

Portanto, a consulta será:

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;

fonte
22
Por outro lado, se você usar apenas a ALTER TABLE tbl CHARACTER SET utf8sintaxe sugerida por outros, alterará apenas a codificação padrão da tabela; as colunas existentes não serão convertidas como seriam se você usar esta resposta.
dia
7
Se você deseja aplicar esta alteração para todas as tabelas que não estão codificadas em ut8 em um banco de dados, você pode usar esta consulta e executar as consultas resultantes: 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
3
isso não está mudando o conjunto de caracteres padrão . para alterar o padrão, faça como disseALTER TABLE tbl CHARACTER SET utf8
Contador em
7
Eu gostaria de acrescentar que geralmente você não deseja usar utf8, mas utf8mb4, para obter o que você espera que utf8 seja. Para explicar: no MySQL, utf8 é realmente apenas um subconjunto de utf8, que seria melhor denominado utf8mb3. Ele só pode codificar até 3 bytes de caracteres utf8 em vez dos até 4 bytes especificados. Isso significa que muitos emojis não serão codificados e serão perdidos se você tentar gravá-los no banco de dados. Veja, por exemplo. medium.com/@adamhooper/… para obter detalhes.
dwt
6
para multibyte você pode usarALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
RN Kushwaha
18

Alterar o conjunto de caracteres padrão da tabela:

ALTER TABLE etape_prospection
  CHARACTER SET utf8,
  COLLATE utf8_general_ci;

Para alterar o conjunto de caracteres da coluna da string, exceda esta consulta:

ALTER TABLE etape_prospection
  CHANGE COLUMN etape_prosp_comment etape_prosp_comment TEXT CHARACTER SET utf8 COLLATE utf8_general_ci;
Devart
fonte
10
Você nunca deve usar utf8_general_ci: ele simplesmente não funciona. É um retrocesso aos maus velhos tempos da estupidez ASCII de cinquenta anos atrás. A correspondência sem diferenciação de maiúsculas e minúsculas Unicode não pode ser feita sem o mapa de pasta do UCD. Por exemplo, “Σίσυφος” contém três sigmas diferentes; ou como a minúscula de “TSCHüẞ” é “tschüβ”, mas a maiúscula de “tschüβ” é “TSCHÜSS”. Você pode estar certo ou pode ser rápido. Portanto, você deve usar utf8_unicode_ci, porque se você não se preocupa com a correção, então é trivial torná-lo infinitamente rápido.
Yohanes AI
1
O conjunto de caracteres MySQL UTF8 está quebrado, você precisa usar utf8mb4!
Samuel Åslund
5

O ALTER TABLEcomando MySQL deve fazer o truque. O comando a seguir mudará o conjunto de caracteres padrão de sua tabela e o conjunto de caracteres de todas as suas colunas para UTF8.

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Este comando converterá todas as colunas semelhantes a texto na tabela para o novo conjunto de caracteres. Os conjuntos de caracteres usam diferentes quantidades de dados por caractere, portanto, o MySQL converterá o tipo de algumas colunas para garantir que haja espaço suficiente para caber o mesmo número de caracteres do antigo tipo de coluna.

Eu recomendo que você leia a documentação ALTER TABLE MySQL antes de modificar qualquer dado ativo.

piersadrian
fonte
1
Sim, ele funciona, mas uma coisa é diferente com a conversão para modo: ele não pode remover a opção charset antiga das colunas automaticamente.
tech_me
3

Se alguém estiver procurando por uma solução completa para alterar o conjunto de caracteres padrão para todas as tabelas do banco de dados e converter os dados, pode ser um:

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 ;

Você pode colocar este código dentro do arquivo, por exemplo, chg_char_set.sqle executá-lo, por exemplo, chamando-o do terminal MySQL:

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

Em seguida, chame o procedimento definido com os parâmetros de entrada desejados, por exemplo

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

Depois de testar os resultados, você pode descartar esses procedimentos armazenados:

DROP PROCEDURE `change_character_set`;
DROP PROCEDURE `exec_query`;
milijan
fonte
Há uma condição ausente que nos leva a selecionar visualizações também. É WHERE table_schema = DATABASE (); => ONDE table_schema = DATABASE () AND table_type = 'BASE TABLE'; Mas obrigado !! Isto é o que eu preciso!
nguyenhoai890
2

Você pode alterar o padrão com um, alter table set default charsetmas isso não mudará o conjunto de caracteres das colunas existentes. Para mudar isso, você precisa usar a alter table modify column.

Alterar o conjunto de caracteres de uma coluna significa apenas que ela será capaz de armazenar uma gama maior de caracteres. Seu aplicativo se comunica com o banco de dados usando o cliente mysql, portanto, você também pode precisar alterar a codificação do cliente.

Joni
fonte
Eu faria se não fosse pelo teclado limitado no iPod touch :-)
Joni
bem, o iPod Touch / iPhone deve ter alguma desvantagem. :-P Nunca percebi que eles estão faltando até que você mencionou. ;-)
Aufwind de
Mantenha pressionado o botão do caractere de citação para ver o caractere de crase.
Chloe