Como converter um conjunto de caracteres e agrupamento de banco de dados MySQL inteiro para UTF-8?

459

Como converter todo o conjunto de caracteres do banco de dados MySQL para UTF-8 e agrupar para UTF-8?

reitor
fonte
22
Para visitantes posteriores: observe as perguntas relacionadas na barra lateral e use utf8_unicode_ci, não utf8_general_ci.
Fuxia 26/03
14
Se você quiser suporte completo UTF-8 você provavelmente vai também querer usar um conjunto de caracteres utf8mb4em vez de utf8como utf8só suporta o plano multilíngüe básico em oposição a toda a gama. Requer o MySQL 5.5.3 ou superior.
Martin Steel
4
Esqueci de mencionar no meu comentário acima, se você mudar para utf8mb4também precisará mudar de agrupamento parautf8mb4_unicode_ci
Martin Steel
3
Melhor ainda, agrupamento utf8mb4_unicode_520_ciou qualquer outra versão disponível.
Rick James
@MartinSteel Eu acredito que esse é o agrupamento por padrão com esse conjunto de caracteres.
precisa saber é o seguinte

Respostas:

715

Use os comandos ALTER DATABASEe ALTER TABLE.

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Ou se você ainda está no MySQL 5.5.2 ou mais antigo que não suporta UTF-8 de 4 bytes, use em utf8vez de utf8mb4:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
BalusC
fonte
12
A CONVERT TOtécnica supõe que o texto tenha sido armazenado corretamente em algum outro conjunto de caracteres (por exemplo, latin1) e não seja confundido (como bytes UTF-8 amontoados na coluna latin1 sem conversão para latin1).
Rick James
1
Isso reconstrói a tabela, tornando-a inviável em grandes sistemas de produção. Se é certo que apenas caracteres ASCII são armazenados nas colunas latin1, é possível alterar o conjunto de caracteres / agrupamento de tabelas sem reconstruir?
Andrew
@Andrew Grandes sistemas de produção geralmente têm um banco de dados espelhado para manutenção.
BalusC
1
alterar charcter set para utf8 altera meu tipo de dados de texto para texto médio. Isso é esperado?
Jerry
1
@Jerry Provavelmente, já que: "Se a coluna for convertida em utf8, cada caractere poderá exigir até três bytes, para um comprimento máximo possível de 3 × 65.535 = 196.605 bytes. Esse comprimento não cabe nos bytes de comprimento de uma coluna TEXT, portanto O MySQL converte o tipo de dados em MEDIUMTEXT, que é o menor tipo de string para o qual os bytes de comprimento podem registrar um valor de 196.605. Da mesma forma, uma coluna VARCHAR pode ser convertida em MEDIUMTEXT. " Alterando o conjunto de caracteres
jabbascript
129
  1. Faça um backup!

  2. Então você precisa definir os conjuntos de caracteres padrão no banco de dados. Isso não converte tabelas existentes, apenas define o padrão para as tabelas recém-criadas.

    ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
  3. Em seguida, você precisará converter o conjunto de caracteres em todas as tabelas existentes e suas colunas. Isso pressupõe que seus dados atuais estejam realmente no conjunto de caracteres atual. Se suas colunas estão definidas para um conjunto de caracteres, mas seus dados são realmente armazenados em outra, você precisará verificar o manual do MySQL sobre como lidar com isso.

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
jornal
fonte
44
Nota: ALTER TABLE nome da tabela CHARACTER SET utf8 define apenas o conjunto de caracteres padrão em uma tabela que é usada para colunas recém-criadas. Ele não converte colunas existentes que já possuem um conjunto de caracteres definido.
newspire
Eu deveria ter lido o backup backup backup primeiro ... mas a minha sorte foi que estava no ambiente de desenvolvimento. então meu voto vai para você!
precisa saber é o seguinte
4
@DominikAngerer: O que quebrou?
cic
16
Observe que utf8_general_cinão é mais a melhor prática recomendada. Desde o MySQL 5.5.3 você deve usar em utf8mb4vez de utf8. Ambos se referem à codificação UTF-8, mas os mais antigos utf8tinham uma limitação específica ao MySQL, impedindo o uso dos caracteres numerados acima 0xFFFD.
precisa saber é o seguinte
76

No shell da linha de comando

Se você é o shell da linha de comando, pode fazer isso muito rapidamente. Basta preencher "dbname": D

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"

Uma linha para copiar / colar simples

DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"
Arnold Daniels
fonte
2
Você pode colocar mais detalhes neste ficoERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DB="dbname"
steros
@ 4485670 É necessário executar isso no shell da linha de comandos . Se você possui apenas a conexão do cliente MySQL disponível, use o código de sdfor abaixo.
Arnold Daniels
6
Esse código funciona muito bem, lembre-se de adicionar -h [nome do host] -u [nome do usuário] -p [senha] após o mysql, conforme necessário.
dispersa
3
Você provavelmente desejará desativar as verificações de chave estrangeira em um sistema real: DB="db_name"; ( echo 'ALTER DATABASE '"$ DB"' `CHARACTER SET utf8 COLLATE utf8_general_ci; '; mysql --uuser -ppassword -hhost "$ DB" -e "MOSTRAR TABELAS" --batch --skip-column-names | xargs -I {} echo 'SET Foreign_key_checks = 0; ALTER TABLE '{}'CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ' ) mysql -uuser -ppassword -hhost "$ DB" `
Adam Nelson
1
Não funcionou para mim até que eu usei "mostrar mesas cheias, onde table_type = 'tabela base'" em vez de "MOSTRAR tabelas"
Brian Peterson
68

Você pode criar o sql para atualizar todas as tabelas com:

SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET utf8 COLLATE utf8_general_ci;   ",
    "ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ") 
    AS alter_sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = your_database_name;

Capture a saída e execute-a.

A resposta de Arnold Daniels acima é mais elegante.

sdfor
fonte
por que você adicionou duas consultas de alteração de tabela? um não é suficiente?
Akshay
7
@ Akshay, boa pergunta. A primeira consulta alter-table define o padrão para novas colunas e a segunda consulta alter-table converte as colunas existentes.
UnlimitedInfinity
4
Para sua informação: de acordo com a documentação do dev.mysql.com/doc/refman/5.5/en/alter-table.html MySQL, a versão "CONVERT TO CHARACTER SET" da instrução ALTER executa as duas etapas em uma etapa: "Para alterar o padrão da tabela conjunto de caracteres e todas as colunas de caracteres (CHAR, VARCHAR, TEXT) para um novo conjunto de caracteres ...
devGuy
2
Eu tenho esse erro # 1054 - coluna desconhecida 'webdb_playground' na cláusula 'where', mas tenho certeza de que meu banco de dados é o correto #
Yannis Dran 24/04/19
1
@YannisDran O nome do seu banco de dados pode não estar em uma sequência, de modo que WHERE TABLE_SCHEMA=webdb_playgroundvocê forneceu o erro desconhecido da coluna, mas WHERE TABLE_SCHEMA="webdb_playground"teria sido bem-sucedido. Algo a tentar no caso de alguém encontrar isso.
Jabbascript # 21/19
17

Antes de prosseguir, verifique se: Você concluiu um backup completo do banco de dados!

Etapa 1: Alterações no Nível do Banco de Dados

  • Identificando o conjunto de agrupamento e caracteres do seu banco de dados

    SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM 
    information_schema.SCHEMATA S
    WHERE schema_name = 'your_database_name'
    AND
    (DEFAULT_CHARACTER_SET_NAME != 'utf8'
        OR
     DEFAULT_COLLATION_NAME not like 'utf8%');
  • Corrigindo o agrupamento para o banco de dados

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Etapa 2: Alterações no nível da tabela

  • Identificando tabelas de banco de dados com o conjunto de caracteres ou agrupamento incorreto

    SELECT CONCAT(
    'ALTER TABLE ',  table_name, ' CHARACTER SET utf8 COLLATE utf8_general_ci;  ', 
    'ALTER TABLE ',  table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ')
    FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
    WHERE C.collation_name = T.table_collation
    AND T.table_schema = 'your_database_name'
    AND
    (C.CHARACTER_SET_NAME != 'utf8'
        OR
     C.COLLATION_NAME not like 'utf8%')
  • Ajustando o agrupamento e o conjunto de caracteres das colunas da tabela

Capture a saída sql superior e execute-a. (como a seguir)

ALTER TABLE rma CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_products CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_products CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_report_period CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_report_period CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_reservation CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_reservation CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_product CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_product CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

consulte: https://confluence.atlassian.com/display/CONFKB/How+to+Fix+the+Collation+and+Character+Set+of+a+MySQL+Database

John Yin
fonte
1
Atualmente, esse script usa 'utf8_unicode_ci' para o db, mas 'utf8_general_ci' para as tabelas - foi intencional? (Eu acho que ambos devem usar o mesmo charset)
gmcnaughton
stackoverflow.com/questions/10957238/... deixaram uma resposta mais completa aqui
VH
8

Use HeidiSQL . É uma ferramenta db gratuita e muito boa.

No menu Ferramentas, insira o editor de tabelas em massa

Selecione o banco de dados completo ou escolha tabelas para converter,

  • tick Alterar agrupamento padrão: utf8mb4_general_ci
  • tick Converter para charset: utf8

Executar

Isso converte o banco de dados completo do latin para utf8 em apenas alguns segundos.

Funciona como um encanto :)

O HeidiSQL se conecta por padrão como utf8, portanto, qualquer caractere especial deve agora ser visto como o caractere (æ ø å) e não como codificado ao inspecionar os dados da tabela.

A verdadeira armadilha ao passar do latin para o utf8 é garantir que o pdo se conecte ao utf8 charset. Caso contrário, você obterá dados de lixo inseridos na tabela utf8 e pontos de interrogação em todo o lugar na sua página da web, fazendo você pensar que os dados da tabela não são utf8 ...

Tom
fonte
Você poderia elaborar por favor? Eu tenho exatamente esse problema - caracteres e espaços especiais aparecem como pontos de interrogação. Estou tentando converter o banco de dados no MAMP usando o PHPMyAdmin. Tendo desenvolvido offline, agora descubro que meu host não suporta utf8mb4. Não tenho o Windows, portanto não posso usar o HeidiSQL. Existe uma maneira de conseguir isso com o PHPMyAdmin?
RexTheRunt
assim. especialmente você tem muita mesa.
tyan 07/07
Eu recebo um erro ao tentar converter o CHARSET: SQL Error (1025): Erro ao renomear ... mas esta é uma ferramenta incrível do gerenciador de SQL!
Marcolopes 04/08/19
Se alguém precisar de uma boa visão geral e tutorial do heidisql, consulte este artigo .
21419 DougB
6

Inspirado pelo comentário do @sd, aqui está um script do bash que faz o trabalho

#!/bin/bash

printf "### Converting MySQL character set ###\n\n"

printf "Enter the encoding you want to set: "
read -r CHARSET

# Get the MySQL username
printf "Enter mysql username: "
read -r USERNAME

# Get the MySQL password
printf "Enter mysql password for user %s:" "$USERNAME"
read -rs PASSWORD

DBLIST=( mydatabase1 mydatabase2 )

printf "\n"


for DB in "${DBLIST[@]}"
do
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
    mysql "$DB" -u"$USERNAME" -p"$PASSWORD" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
) \
| mysql "$DB" -u"$USERNAME" -p"$PASSWORD"

echo "$DB database done..."
done

echo "### DONE ###"
exit
Camoflame
fonte
4

Caso os dados não estejam no mesmo conjunto de caracteres, considere este trecho em http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html

Se a coluna tiver um tipo de dados não binários (CHAR, VARCHAR, TEXT), seu conteúdo deverá ser codificado no conjunto de caracteres da coluna, e não em outro conjunto de caracteres. Se o conteúdo estiver codificado em um conjunto de caracteres diferente, você poderá converter a coluna para usar primeiro um tipo de dados binários e, em seguida, para uma coluna não binária com o conjunto de caracteres desejado.

Aqui está um exemplo:

 ALTER TABLE t1 CHANGE c1 c1 BLOB;
 ALTER TABLE t1 CHANGE c1 c1 VARCHAR(100) CHARACTER SET utf8;

Certifique-se de escolher o agrupamento correto, ou você poderá obter conflitos de chave exclusivos. por exemplo, Éleanore e Eleanore podem ser considerados os mesmos em alguns agrupamentos.

A parte, de lado:

Eu tive uma situação em que certos caracteres "quebraram" nos emails, mesmo que eles estivessem armazenados como UTF-8 no banco de dados. Se você estiver enviando e-mails usando dados utf8, convém também converter seus e-mails para enviar em UTF8.

No PHPMailer, atualize esta linha: public $CharSet = 'utf-8';

Frank Forte
fonte
4

Para bancos de dados que possuem um número alto de tabelas, você pode usar um script php simples para atualizar o conjunto de caracteres do banco de dados e de todas as tabelas usando o seguinte:

$conn = mysqli_connect($host, $username, $password, $database);

if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

$alter_database_charset_sql = "ALTER DATABASE ".$database." CHARACTER SET utf8 COLLATE utf8_unicode_ci";
mysqli_query($conn, $alter_database_charset_sql);

$show_tables_result = mysqli_query($conn, "SHOW TABLES");
$tables  = mysqli_fetch_all($show_tables_result);

foreach ($tables as $index => $table) {
  $alter_table_sql = "ALTER TABLE ".$table[0]." CONVERT TO CHARACTER SET utf8  COLLATE utf8_unicode_ci";
  $alter_table_result = mysqli_query($conn, $alter_table_sql);
  echo "<pre>";
  var_dump($alter_table_result);
  echo "</pre>";
}
Dan Lucas
fonte
De onde executamos esse script?
Yannis Dran 24/04/19
1
@YannisDran Não deve importar, desde que o IP do qual você o esteja executando tenha acesso ao banco de dados. Certifique-se de fazer um backup primeiro!
Dan Lucas
Bom, e como o executamos? Temos que carregá-lo no servidor e, em seguida, executar digite o caminho para sua posição?
Yannis Dran
4
DELIMITER $$  

CREATE PROCEDURE `databasename`.`update_char_set`()  

BEGIN  
 DECLARE done INT DEFAULT 0;  
 DECLARE t_sql VARCHAR(256);  
 DECLARE tableName VARCHAR(128);  
 DECLARE lists CURSOR FOR SELECT table_name FROM `information_schema`.`TABLES` WHERE table_schema = 'databasename';  
 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;  
 OPEN lists;  
 FETCH lists INTO tableName;  
 REPEAT  
    SET @t_sql = CONCAT('ALTER TABLE ', tableName, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci');  
    PREPARE stmt FROM @t_sql;  
    EXECUTE stmt;  
    DEALLOCATE PREPARE stmt;  
 FETCH lists INTO tableName;  
 UNTIL done END REPEAT;  
 CLOSE lists;  
END$$  

DELIMITER ;  

CALL databasename.update_char_set();
剑 二十 三
fonte
Obrigado, esta é uma das poucas respostas que mostram como fazê-lo para todo o banco de dados (ou seja, cada tabela). Funcionou como um encanto.
Machisuji 15/02/19
3
mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql
cp dump.sql dump-fixed.sql
vim dump-fixed.sql


:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql
Soumik Guha
fonte
3

A maneira mais segura é modificar as colunas primeiro para um tipo binário e depois modificá-las novamente para o tipo usando o conjunto de caracteres desejado.

Cada tipo de coluna tem seu respectivo tipo binário, da seguinte maneira:

  1. CHAR => BINÁRIO
  2. TEXTO => BLOB
  3. TINYTEXT => TINYBLOB
  4. MEDIUMTEXT => MEDIUMBLOB
  5. LONGTEXT => LONGBLOB
  6. VARCHAR => VARBINÁRIO

Por exemplo.:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARBINARY;

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARCHAR(140) CHARACTER SET utf8mb4;

Eu tentei em várias tabelas latin1 e manteve todos os diacríticos.

Você pode extrair esta consulta para todas as colunas fazendo isso:

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' VARBINARY;'),
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' ', COLUMN_TYPE,' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM information_schema.columns
WHERE TABLE_SCHEMA IN ('[TABLE_SCHEMA]')
AND COLUMN_TYPE LIKE 'varchar%'
AND (COLLATION_NAME IS NOT NULL AND COLLATION_NAME NOT LIKE 'utf%');

Depois de fazer isso em todas as suas colunas, faça-o em todas as tabelas:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

Para gerar esta consulta para toda a sua tabela, use a seguinte consulta:

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_COLLATION NOT LIKE 'utf8%'
and TABLE_SCHEMA in ('[TABLE_SCHEMA]');

E agora que você modificou todas as suas colunas e tabelas, faça o mesmo no banco de dados:

ALTER DATABASE [DATA_BASE_NAME] CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;
MalachiteBR
fonte
1

Se você não conseguir converter suas tabelas ou sua tabela estiver sempre definida com um conjunto de caracteres não utf8, mas você desejar utf8, sua melhor aposta pode ser limpá-la e começar de novo e especificar explicitamente:

create database database_name character set utf8;
user3013048
fonte
0

A única solução que funcionou para mim: http://docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8

Convertendo um banco de dados contendo tabelas

mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql

cp dump.sql dump-fixed.sql
vim dump-fixed.sql

:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql
utapyngo
fonte
0

alterar tabela nome_tabela charset = 'utf8';

Esta é uma consulta simples que eu pude usar no meu caso. Você pode alterar o nome_tabela conforme suas exigências.

Aditya Seth
fonte
Normalmente, uma resposta deve ser acompanhada de alguma explicação sobre o que você sugere fazer.
RiggsFolly
0

Para alterar o conjunto de caracteres que codifica para UTF-8 para o próprio banco de dados, digite o seguinte comando no prompt mysql>. Substitua DBNAME pelo nome do banco de dados:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
Nyein Aung
fonte
0

Você também pode usar a ferramenta de banco de dados Navicat, o que facilita mais.

  • Shiva.

Clique com o botão direito do mouse em seu banco de dados e selecione Propriedades e alteração do banco de dados conforme desejado em Drop Down

insira a descrição da imagem aqui

rvsiva17
fonte
0

Solução de linha de comando e excluir visualizações

Estou simplesmente preenchendo a resposta de @ Jasny para outras pessoas como @Brianeu e que temos visualizações em nosso banco de dados.

Se você tiver um erro como este:

ERROR 1347 (HY000) at line 17: 'dbname.table_name' is not of type 'BASE TABLE'

É porque você provavelmente tem visualizações e precisa excluí-las. Mas ao tentar excluí-los, o MySQL retorna 2 colunas em vez de 1.

SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE';
-- table_name1  BASE TABLE
-- table_name2  BASE TABLE

Portanto, temos que adaptar o comando de Jasny awkpara extrair apenas a 1ª coluna que contém o nome da tabela.

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names \
    | awk '{print $1 }' \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"

Uma linha para copiar / colar simples

DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names | awk '{print $1 }' | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"
Natsimhan
fonte
-1

Para alterar a codificação do conjunto de caracteres para UTF-8, siga as etapas simples no PHPMyAdmin

  1. Selecione seu banco de dados SS

  2. Ir para Operações SS

  3. Na guia operações, no menu suspenso agrupamento inferior, selecione a codificação desejada (utf8_general_ci) e marque a caixa de seleção (1) alterar todos os agrupamentos de tabelas, (2) alterar todos os agrupamentos de colunas das tabelas. e pressione Go.

SS

pisar khuram
fonte