¿Cómo convertir un conjunto de caracteres y una clasificación de la base de datos MySQL completa a UTF-8?

459

¿Cómo puedo convertir todo el conjunto de caracteres de la base de datos MySQL a UTF-8 y la clasificación a UTF-8?

Decano
fuente
22
Para visitantes posteriores: tenga en cuenta las preguntas relacionadas en la barra lateral y use utf8_unicode_ci, no utf8_general_ci.
fuxia
14
Si quieres soporte completo de UTF-8 es probable que también desea utilizar un juego de caracteres de utf8mb4más que utf8tan utf8sólo es compatible con el plano multilingüe básico en contraposición a toda la gama. Requiere MySQL 5.5.3 o superior.
Martin Steel
44
Olvidé mencionar en mi comentario anterior, si cambias a utf8mb4, también tendrás que cambiar la clasificación autf8mb4_unicode_ci
Martin Steel
3
Aún mejor, cotejo utf8mb4_unicode_520_ci, o lo que sea, es la última versión disponible.
Rick James el
@ MartinSteel Creo que esa es la recopilación por defecto con ese conjunto de caracteres.
VaTo

Respuestas:

715

Usa los comandos ALTER DATABASEy ALTER TABLE.

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

O si todavía está en MySQL 5.5.2 o anterior que no era compatible con UTF-8 de 4 bytes, use en utf8lugar 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
fuente
12
La CONVERT TOtécnica supone que el texto se almacenó correctamente en algún otro conjunto de caracteres (p. Ej., Latin1), y no se desglosó (como los bytes UTF-8 metidos en la columna latin1 sin conversión a latin1).
Rick James
1
Esto reconstruye la tabla haciéndola inviable en grandes sistemas de producción. Si es seguro que solo los caracteres ASCII se almacenan en las columnas latin1, ¿es posible cambiar el conjunto de caracteres / clasificación de la tabla sin reconstruir?
Andrew
@ Andrew Los sistemas de producción grandes generalmente tienen una base de datos reflejada para mantenimiento.
BalusC
1
cambiar el conjunto de caracteres a utf8 cambia mi tipo de datos de texto a medio texto. ¿Se espera?
Jerry
1
@Jerry Probablemente, ya que: "Si la columna se convierte a utf8, cada carácter puede requerir hasta tres bytes, para una longitud máxima posible de 3 × 65,535 = 196,605 bytes. Esa longitud no cabe en los bytes de longitud de una columna de TEXTO, entonces MySQL convierte el tipo de datos a MEDIUMTEXT, que es el tipo de cadena más pequeño para el cual los bytes de longitud pueden registrar un valor de 196,605. De manera similar, una columna VARCHAR podría convertirse a MEDIUMTEXT ". Cambio del conjunto de caracteres
jabbascript
129
  1. ¡Hacer una copia de seguridad!

  2. Luego debe establecer los conjuntos de caracteres predeterminados en la base de datos. Esto no convierte las tablas existentes, solo establece el valor predeterminado para las tablas recién creadas.

    ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
  3. Luego, deberá convertir el conjunto de caracteres en todas las tablas existentes y sus columnas. Esto supone que sus datos actuales están realmente en el conjunto de caracteres actual. Si sus columnas están configuradas en un conjunto de caracteres pero sus datos realmente están almacenados en otro, deberá verificar manual de MySQL sobre cómo manejar esto.

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
Newspire
fuente
44
Nota: ALTER TABLE tablename CHARACTER SET utf8 solo establece el conjunto de caracteres predeterminado en una tabla que se utiliza para las columnas recién creadas. No convierte las columnas existentes que ya tienen un conjunto de caracteres establecido.
newspire
Debería haber leído la copia de respaldo primero ... pero mi suerte fue que estaba en el entorno de desarrollo. ¡Entonces mi voto a favor va para ti!
DominikAngerer
44
@DominikAngerer: ¿Qué se rompió?
cic
16
Tenga en cuenta que utf8_general_ciya no se recomienda la mejor práctica. Desde MySQL 5.5.3 debe usar en utf8mb4lugar de utf8. Ambos se refieren a la codificación UTF-8, pero el anterior utf8tenía una limitación específica de MySQL que impedía el uso de los caracteres enumerados anteriormente 0xFFFD.
u01jmg3
76

En la línea de comandos

Si eres uno de los comandos de la línea de comandos, puedes hacerlo rápidamente. Simplemente complete "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"

One-liner para copiar / pegar simple

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
fuente
2
¿Se puede poner más detalle en este reciboERROR 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"
equipo musical
@ 4485670 Debe ejecutar esto en el shell de la línea de comandos . Si solo tiene disponible la conexión de cliente MySQL, use el código de sdfor a continuación.
Arnold Daniels
66
Este código funciona muy bien, solo recuerde agregar -h [nombre de host] -u [nombre de usuario] -p [contraseña] después de mysql según sea necesario.
dispersarse el
3
Probablemente desee deshabilitar las comprobaciones de clave externa en un sistema real: DB="db_name"; ( echo 'ALTER DATABASE '"$ DB"' `CHARACTER SET utf8 COLLATE utf8_general_ci; '; mysql --uuser -ppassword -hhost "$ DB" -e "MOSTRAR TABLAS" --batch --skip-column-names | xargs -I {} echo 'SET foreign_key_checks = 0; ALTERAR TABLA '{}'CONVERTIR AL CONJUNTO DE CARACTERES utf8 COLLATE utf8_general_ci; ' ) | mysql -uuser -ppassword -hhost "$ DB" `
Adam Nelson
1
No funcionó para mí hasta que usé "mostrar tablas completas donde Table_Type = 'BASE TABLE'" en lugar de "SHOW TABLES"
Brian Peterson
68

Puede crear el sql para actualizar todas las tablas con:

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 la salida y ejecútela.

La respuesta anterior de Arnold Daniels es más elegante.

sdfor
fuente
¿Por qué agregaste dos consultas de alterar tabla? uno no es suficiente?
Akshay
77
@Akshay, buena pregunta. La primera consulta alter-table establece el valor predeterminado para las nuevas columnas, y la segunda consulta alter-table convierte las columnas existentes.
Ilimitado
44
FYI: de acuerdo con dev.mysql.com/doc/refman/5.5/en/alter-table.html documentación MySQL, la versión "CONVERTIR A CARACTER SET" de la declaración ALTER hace ambas cosas en un solo paso: "Para cambiar la tabla predeterminada conjunto de caracteres y todas las columnas de caracteres (CHAR, VARCHAR, TEXT) a un nuevo conjunto de caracteres ...
devGuy
2
Tengo este error # 1054: columna desconocida 'webdb_playground' en 'cláusula where', pero estoy seguro de que mi base de datos es la correcta
Yannis Dran
1
@YannisDran Es posible que su nombre de base de datos no haya estado en una cadena, de modo que WHERE TABLE_SCHEMA=webdb_playgroundle dio el error de columna desconocido, pero WHERE TABLE_SCHEMA="webdb_playground"habría sido exitoso. Algo para probar en caso de que alguien más se encuentre con eso.
jabbascript
17

Antes de continuar, asegúrese de que: ¡Ha completado una copia de seguridad completa de la base de datos!

Paso 1: cambios en el nivel de la base de datos

  • Identificar la recopilación y el juego de caracteres de su base de datos

    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%');
  • Arreglando la colación para la base de datos

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Paso 2: cambios en el nivel de la tabla

  • Identificación de tablas de bases de datos con el conjunto de caracteres o la clasificación incorrectos

    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%')
  • Ajuste de la clasificación y el conjunto de caracteres de las columnas de la tabla

Capture la salida sql superior y ejecútela. (como 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
fuente
1
Actualmente este script usa 'utf8_unicode_ci' para la base de datos pero 'utf8_general_ci' para las tablas. ¿Fue intencional? (Creo que ambos deberían usar el mismo
juego de
stackoverflow.com/questions/10957238/… han dejado una respuesta más completa aquí
VH
8

Use HeidiSQL . Es gratis y una muy buena herramienta de db.

Desde el menú de herramientas, ingrese al editor de tabla masiva

Seleccione la base de datos completa o elija tablas para convertir,

  • marque Cambiar intercalación predeterminada: utf8mb4_general_ci
  • marque Convertir en juego de caracteres: utf8

Ejecutar

Esto convierte la base de datos completa de latín a utf8 en solo unos segundos.

Funciona de maravilla :)

HeidiSQL se conecta de forma predeterminada como utf8, por lo que cualquier carácter especial ahora debe verse como el carácter (æ ø å) y no como codificado al inspeccionar los datos de la tabla.

La verdadera trampa al pasar de latín a utf8 es asegurarse de que pdo se conecta con utf8 charset. Si no, obtendrá datos de basura insertados en la tabla utf8 y signos de interrogación en todo el lugar de su página web, haciéndole pensar que los datos de la tabla no son utf8 ...

Tom
fuente
¿Podría elaborar por favor? Tengo exactamente este problema: los caracteres y espacios especiales aparecen como signos de interrogación. Estoy tratando de convertir la base de datos en MAMP usando PHPMyAdmin. Habiendo desarrollado sin conexión, ahora descubro que mi host no es compatible con utf8mb4. No tengo Windows, así que no puedo usar HeidiSQL. ¿Hay alguna manera de lograr esto con PHPMyAdmin?
RexTheRunt
de esta manera especialmente tienes mucha mesa.
tyan
Obtengo un error al intentar convertir el CHARSET: Error de SQL (1025): Error al cambiar el nombre ... ¡pero esta es una herramienta increíble de administrador de SQL!
marcolopes
Si alguien necesita una buena descripción general y un tutorial para heidisql, consulte este artículo .
DougB
6

Inspirado por @sdfor comment, aquí hay un script bash que hace el trabajo

#!/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
fuente
4

En caso de que los datos no estén en el mismo juego de caracteres, puede considerar este fragmento de http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html

Si la columna tiene un tipo de datos no binario (CHAR, VARCHAR, TEXT), su contenido debe codificarse en el conjunto de caracteres de la columna, no en algún otro conjunto de caracteres. Si los contenidos están codificados en un conjunto de caracteres diferente, puede convertir la columna para usar un tipo de datos binarios primero, y luego a una columna no binaria con el conjunto de caracteres deseado.

Aquí hay un ejemplo:

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

Asegúrese de elegir la clasificación correcta, o podría obtener conflictos clave únicos. por ejemplo, Éleanore y Eleanore podrían considerarse lo mismo en algunas colaciones.

Aparte:

Tuve una situación en la que ciertos caracteres "se rompieron" en los correos electrónicos a pesar de que estaban almacenados como UTF-8 en la base de datos. Si está enviando correos electrónicos utilizando datos utf8, es posible que también desee convertir sus correos electrónicos para enviarlos en UTF8.

En PHPMailer, solo actualice esta línea: public $CharSet = 'utf-8';

Frank Forte
fuente
4

Para las bases de datos que tienen una gran cantidad de tablas, puede usar un script php simple para actualizar el conjunto de caracteres de la base de datos y todas las tablas usando lo siguiente:

$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
fuente
¿De dónde ejecutamos este script?
Yannis Dran
1
@YannisDran No debería importar, siempre y cuando la IP desde la que lo ejecuta tenga acceso a la base de datos. ¡Asegúrate de hacer una copia de seguridad primero!
Dan Lucas
Bien, y cómo lo ejecutamos? ¿Tenemos que cargarlo en el servidor y luego ejecutar enter la ruta a su posición?
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();
剑 二十 三
fuente
Gracias, esta es una de las pocas respuestas que realmente muestran cómo hacerlo en toda la base de datos (es decir, cada tabla). Trabajado como un encanto.
Machisuji
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
fuente
3

La forma más segura es modificar las columnas primero a un tipo binario y luego modificarlo de nuevo a su tipo usando el juego de caracteres deseado.

Cada tipo de columna tiene su respectivo tipo binario, como sigue:

  1. CHAR => BINARIO
  2. TEXTO => BLOB
  3. TINYTEXT => TINYBLOB
  4. MEDIUMTEXT => MEDIUMBLOB
  5. LONGTEXT => LONGBLOB
  6. VARCHAR => VARBINARIO

P.ej.:

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

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

Lo intenté en varias tablas latin1 y mantuvo todos los diacríticos.

Puede extraer esta consulta para todas las columnas haciendo esto:

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%');

Después de hacer esto en todas sus columnas, lo hace en todas las tablas:

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

Para generar esta consulta para toda su tabla, use la siguiente 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]');

Y ahora que modificó todas sus columnas y tablas, haga lo mismo en la base de datos:

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

Si no puede convertir sus tablas o si su tabla siempre está configurada con un conjunto de caracteres que no sea utf8, pero desea utf8, su mejor opción podría ser borrarla y comenzar de nuevo y especificar explícitamente:

create database database_name character set utf8;
usuario3013048
fuente
0

La única solución que funcionó para mí: http://docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8

Convertir una base de datos que contiene tablas

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
fuente
0

alter table table_name charset = 'utf8';

Esta es una consulta simple que pude usar para mi caso, puede cambiar el nombre_tabla según sus requisitos.

Aditya Seth
fuente
Normalmente, una respuesta debe ir acompañada de alguna explicación de lo que sugiere hacer.
RiggsFolly
0

Para cambiar la codificación del juego de caracteres a UTF-8 para la base de datos en sí, escriba el siguiente comando en el indicador mysql>. Reemplace DBNAME con el nombre de la base de datos:

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

También puede usar la herramienta de base de datos Navicat, que lo hace más fácil.

  • Siva

Haga clic con el botón derecho en su base de datos y seleccione Propiedades y cambio de base de datos como desee en el menú desplegable

ingrese la descripción de la imagen aquí

rvsiva17
fuente
0

Solución de línea de comandos y excluir vistas

Simplemente estoy completando la respuesta de @ Jasny para otras personas como @Brianyo que tenemos puntos de vista en nuestra base de datos.

Si tiene un error como este:

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

Es porque probablemente tenga vistas y necesite excluirlas. Pero al intentar excluirlos, MySQL devuelve 2 columnas en lugar de 1.

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

Entonces tenemos que adaptar el comando de Jasny awkpara extraer solo la primera columna que contiene el nombre de la tabla.

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"

One-liner para copiar / pegar simple

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
fuente
-1

Para cambiar la codificación del juego de caracteres a UTF-8, siga los pasos simples en PHPMyAdmin

  1. Seleccione su base de datos SS

  2. Ir a operaciones SS

  3. En la pestaña de operaciones, en el menú desplegable de intercalación inferior, seleccione la codificación que desee, es decir (utf8_general_ci), y también marque la casilla de verificación (1) cambiar todas las intercalaciones de tablas, (2) Cambiar todas las intercalaciones de columnas de tablas. y pulsa Go.

SS

banda de rodadura khuram
fuente