it-swarm.dev

Como eu mudo uma tabela MySQL para UTF-8?

Eu sei que existem muitas configurações para um idioma para uma tabela e um banco de dados.

Eu já criei o banco de dados. Eu acredito que quando eu criei, era padrão/latim. Eu quero mudar tudo - quero dizer ... tanto a tabela e o banco de dados, para UTF-8 .

Como eu posso fazer isso? obrigado.

22
TIMEX
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8;
49
Developer-Sid

Dê uma olhada em Usando o comando alter para alterar o conjunto de caracteres .

Outro link útil: http://dev.mysql.com/doc/refman/5.0/en/charset-table.html

A forma geral é

ALTER DATABASE db_name
    [[DEFAULT] CHARACTER SET charset_name]
    [[DEFAULT] COLLATE collation_name]

e para uma coluna específica em uma tabela

ALTER TABLE column COLLATE utf8_general_ci

4
aioobe

a resposta do aioobe diz como alterar o conjunto de caracteres de um banco de dados, tabela ou coluna. Você deve ter em mente que

  • definir o conjunto de caracteres para uma tabela apenas especifica o conjunto de caracteres padrão para novas colunas nessa tabela. Não altera o conjunto de caracteres para colunas pré-existentes; você tem que fazer essas colunas individualmente, OR se você quiser alterar cada coluna do tipo string na tabela para o mesmo conjunto de caracteres, há um comando que você pode usar para fazer isso: "alter table ... converter para conjunto de caracteres "( http://dev.mysql.com/doc/refman/5.1/en/alter-table.html )

  • se você já tiver dados armazenados incorretamente codificados em uma coluna, usar "alterar tabela ... modificar" para alterar a coluna não resolverá o problema. Por exemplo, se você estiver armazenando dados UTF-8 em uma coluna Latin1 e alterar o conjunto de caracteres diretamente de Latin1 para UTF-8, ele ainda será codificado incorretamente posteriormente. Isso pode ser contornado convertendo do Latin-1 para o UTF-8 via binário.

4
Philip Eve

1) Conjunto de caracteres padrão e agrupamento do banco de dados:

SELECT @@character_set_database, @@collation_database;

Alterado via: ALTER DATABASE CHARACTER SET utf8 COLLATE utf8_general_ci;

2) Conjunto de caracteres padrão e agrupamento da tabela:

SELECT T.table_name, CCSA.character_set_name 
FROM information_schema.TABLES T, information_schema.COLLATION_CHARACTER_SET_APPLICABILITY CCSA 
WHERE CCSA.collation_name = T.table_collation AND T.table_schema = "YOUR_DB";`

Alterado via: ALTER TABLE [table_name] CHARACTER SET utf8 COLLATE utf8_general_ci

3) Conjunto de caracteres de coluna e collation:

SELECT c.TABLE_NAME, c.COLUMN_NAME, c.CHARACTER_SET_NAME, c.COLLATION_NAME 
FROM information_schema.COLUMNS c
WHERE c.table_schema = "YOUR_DB";`

Alterado via: ALTER TABLE [table_name] CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

O terceiro requer que você desative as verificações de chave estrangeira para a conversão de dados. Então, colocando tudo isso junto:

DELIMITER //
CREATE PROCEDURE migrate_charset_to_utf8()
  BEGIN
    DECLARE done TINYINT DEFAULT 0;
    DECLARE curr_table VARCHAR(64);

    DECLARE table_cursor CURSOR FOR
    SELECT T.table_name
      FROM information_schema.TABLES T
      WHERE T.TABLE_TYPE = 'BASE TABLE' AND
        T.TABLE_SCHEMA = 'YOUR_DB';
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    OPEN table_cursor;

    table_loop: LOOP
      FETCH table_cursor INTO curr_table;
      IF done THEN
        LEAVE table_loop;
      END IF;

      # Convert table data(columns) charset
      SET @sql_str1 = CONCAT("ALTER TABLE ", curr_table, " CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
      PREPARE stmt1 FROM @sql_str1;
      EXECUTE stmt1;
      DEALLOCATE PREPARE stmt1;

      # Set table's default charset e.g for new columns added
      SET @sql_str2 = CONCAT("ALTER TABLE ", curr_table, " CHARACTER SET utf8 COLLATE utf8_general_ci");
      PREPARE stmt2 FROM @sql_str2;
      EXECUTE stmt2;
      DEALLOCATE PREPARE stmt2;

    END LOOP table_loop;

    CLOSE table_cursor;
  END//

DELIMITER ;


SET @@FOREIGN_KEY_CHECKS = 0;
CALL migrate_charset_to_utf8();
SET @@FOREIGN_KEY_CHECKS = 1;

ALTER DATABASE CHARACTER SET utf8 COLLATE utf8_general_ci;

EDIT: olha aqui em vez disso

0
Roly