¿Cómo cambiar la clasificación de la base de datos, tabla, columna?
La respuesta seleccionada simplemente lo indica a nivel de tabla.
Cambiando toda la base de datos:
ALTERDATABASE<database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Cambiándolo por tabla:
ALTERTABLE<table_name>CONVERTTO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Una buena práctica es cambiarlo a nivel de tabla, ya que también lo cambiará por columnas. Cambiar para una columna específica es para cualquier caso específico.
Cambio de intercalación para una columna específica:
ALTERTABLE<table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Este realmente responde la pregunta directamente. Necesitaba esto, ya que mis cambios a nivel de tabla NO actualizaban las columnas. Investigaré eso más tarde; pero esta es la información que me ayudó a superar los tiempos difíciles. Gracias.
Parapluie
9
La mejor respuesta para esto.
jubi4dition
Sí, necesita especificar el tipo de columna. Aquí hay un comando mágico para obtener todos los tipos. Con la edición de varias líneas, puede generar el comando para actualizar todas las columnas a la vez a partir de aquí:SELECT table_schema , table_name , column_name , COLLATION_NAME , COLUMN_TYPE FROM information_schema.columns WHERE collation_name != 'utf8_general_ci' AND table_schema not in ('information_schema','mysql', 'performance_schema','sys');
William Entriken
Para una sola columna, simplemente puede hacer: ALTER TABLE table_name CHANGE column_name VARCHAR (45) COLLATE utf8mb4_bin;
TomoMiha
68
Puedes ejecutar un script php.
<?php
$con = mysql_connect('localhost','user','password');if(!$con){ echo "Cannot connect to the database ";die();}
mysql_select_db('dbname');$result=mysql_query('show tables');while($tables = mysql_fetch_array($result)){
foreach ($tables as$key=>$value){
mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");}}
echo "The collation of your database has been successfully changed!";?>
Para cambiar la clasificación de tablas individualmente, puede usar,
ALTERTABLE mytable CONVERTTO CHARACTER SET utf8
Para establecer la clasificación predeterminada para toda la base de datos,
ALTERDATABASE`databasename`DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
si no,
Ir a PhpMyAdmin-> Operaciones-> Colación.
Allí puede encontrar el cuadro de selección que contiene todas las colaciones existentes. Para que aquí puedas cambiar tu colación. Entonces, después de la tabla de la base de datos, seguirá esta clasificación mientras está creando una nueva columna. No es necesario seleccionar intercalación al crear nuevas columnas.
La siguiente consulta generará consultas ALTER que cambian la clasificación para todas las columnas apropiadas en todas las tablas a un cierto tipo (utf8_general_ci en mi ejemplo a continuación).
SELECT concat
('ALTER TABLE ',
t1.TABLE_SCHEMA,'.',
t1.table_name,' MODIFY ',
t1.column_name,' ',
t1.data_type,'(',
CHARACTER_MAXIMUM_LENGTH,')',' CHARACTER SET utf8 COLLATE utf8_general_ci;')from
information_schema.columns t1
where
t1.TABLE_SCHEMA like'you_db_name_goes_here'AND
t1.COLLATION_NAME ISNOTNULLAND
t1.COLLATION_NAME NOTIN('utf8_general_ci');
+1 Me gusta más esta respuesta. No todos tienen PHP mágicamente en alguna parte. Algunos usan otros lenguajes con MySQL. Esto fue fácil de ejecutar en MySQL Workbench, copie las filas y péguelo. Acabo de hacer el paso adicional para ejecutar lo anterior information_schema.tablesy el código en concatALTER TABLE 'schema'.'table' CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_bin ;
Pierre
1
Esto produce errores en los tipos de columna de texto (medio / largo), que deben limpiarse manualmente
1919
11
Si ejecuta phpMyAdmin >> seleccione la base de datos >> seleccione la tabla >> vaya a la pestaña "Operaciones" >> en la sección "Opciones de la tabla" >> puede elegir la Clasificación en la lista desplegable >> y una vez que presione {Ir} en el en la parte superior de la pantalla verá un mensaje:
Su consulta SQL se ha ejecutado con éxito.
y un guion
ALTERTABLE`tableName`CONVERTTO CHARACTER SET utf8 COLLATE utf8_general_ci
Pero NO cambiará las colaciones de las columnas existentes. Para hacerlo, puede usar este script (este también vino de phpMyAdmin)
ALTERTABLE`tableName` CHANGE `Name``Name` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOTNULL
Puede cambiar el CHARSET y COLLATION de todas sus tablas mediante el script PHP de la siguiente manera. Me gusta la respuesta de hkasera pero el problema es que la consulta se ejecuta dos veces en cada tabla. Este código es casi el mismo, excepto el uso de MySqli en lugar de mysql y la prevención de consultas dobles. Si pudiera votar, habría votado la respuesta de hkasera.
<?php
$conn1=new MySQLi("localhost","user","password","database");if($conn1->connect_errno){
echo mysqli_connect_error();exit;}$res=$conn1->query("show tables")or die($conn1->error);while($tables=$res->fetch_array()){$conn1->query("ALTER TABLE $tables[0] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci")or die($conn1->error);}
echo "The collation of your database has been successfully changed!";$res->free();$conn1->close();?>
Esto funcionó perfectamente para mí, después de la actualización a Zabbix 5. Sólo para decir que he cambiado el juego de caracteres y colación de esta manera: CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin.
robe007
4
Simplemente puede agregar este código al archivo de script
//Database Connection
$host ='localhost';$db_name ='your_database_name';$db_user ='your_database_user_name';$db_pass ='your_database_user_password';$con = mysql_connect($host,$db_user,$db_pass);if(!$con){ echo "Cannot connect to the database ";die();}
mysql_select_db($db_name);$result=mysql_query('show tables');while($tables = mysql_fetch_array($result)){
foreach ($tables as$key=>$value){
mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");}}
echo "The collation of your database has been successfully changed!";
Me sorprendió aprender, así que tuve que volver aquí e informar que el excelente y bien mantenido script Interconnect / it SAFE SEARCH AND REPLACE ON DATABASE tiene algunas opciones para convertir tablas a utf8 / unicode, e incluso para convertir a innodb . Es un script que se usa comúnmente para migrar un sitio web impulsado por una base de datos (Wordpress, Drupal, Joomla, etc.) de un dominio a otro.
Lo leí aquí, que necesitas convertir cada tabla manualmente, no es cierto. Aquí hay una solución sobre cómo hacerlo con un procedimiento almacenado:
DELIMITER $$DROPPROCEDUREIFEXISTS changeCollation$$-- character_set parameter could be 'utf8'-- or 'latin1' or any other valid character setCREATEPROCEDURE changeCollation(IN character_set VARCHAR(255))BEGINDECLARE v_finished INTEGER DEFAULT0;DECLARE v_table_name varchar(255)DEFAULT"";DECLARE v_message varchar(4000)DEFAULT"No records";-- This will create a cursor that selects each table,-- where the character set is not the one-- that is defined in the parameterDECLARE alter_cursor CURSORFORSELECTDISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA =DATABASE()AND COLLATION_NAME NOTLIKE CONCAT(character_set,'_%');-- This handler will set the value v_finished to 1-- if there are no more rowsDECLARECONTINUE HANDLER
FORNOT FOUND SET v_finished =1;OPEN alter_cursor;-- Start a loop to fetch each rows from the cursor
get_table: LOOP
-- Fetch the table names one by oneFETCH alter_cursor INTO v_table_name;-- If there is no more record, then we have to skip-- the commands inside the loopIF v_finished =1THEN
LEAVE get_table;ENDIF;IF v_table_name !=''THENIF v_message ='No records'THENSET v_message ='';ENDIF;-- This technic makes the trick, it prepares a statement-- that is based on the v_table_name parameter and it means-- that this one is different by each iteration inside the loopSET@s = CONCAT('ALTER TABLE ',v_table_name,' CONVERT TO CHARACTER SET ', character_set);
PREPARE stmt FROM@s;EXECUTE stmt;DEALLOCATE PREPARE stmt;SET v_message = CONCAT('The table ', v_table_name ,' was changed to the default collation of ', character_set,'.\n', v_message);SET v_table_name ='';ENDIF;-- Close the loop and the cursorEND LOOP get_table;CLOSE alter_cursor;-- Returns information about the altered tables or 'No records'SELECT v_message;END$$
DELIMITER ;
Después de crear el procedimiento, llámelo simplemente:
Usé el siguiente script de shell. Toma el nombre de la base de datos como parámetro y convierte todas las tablas en otro conjunto de caracteres y clasificación (dado por otros parámetros o valores predeterminados definidos en el script).
#!/bin/bash
# mycollate.sh <database>[<charset><collation>]# changes MySQL/MariaDB charset and collation for one database-all tables and#all columns inall tables
DB="$1"
CHARSET="$2"
COLL="$3"[-n "$DB"]||exit1[-n "$CHARSET"]|| CHARSET="utf8mb4"[-n "$COLL"]|| COLL="utf8mb4_general_ci"
echo $DB
echo "ALTER DATABASE $DB CHARACTER SET $CHARSET COLLATE $COLL;"| mysql
echo "USE $DB; SHOW TABLES;"| mysql -s |(whilereadTABLE; do
echo $DB.$TABLE
echo "ALTER TABLE $TABLE CONVERT TO CHARACTER SET $CHARSET COLLATE $COLL;"| mysql $DB
done
)
Mi solución es una combinación de @Dzintars y @Quassnoi Answer.
SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA,'.', TABLE_NAME," CONVERT TO CHARACTER SET utf8mb4 ;")AS ExecuteTheString
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="<your-database>"AND TABLE_TYPE="BASE TABLE";
Al usar CONVERT TO, esto genera una secuencia de comandos, que convierte todas las tablas <your-database>a la codificación solicitada. ¡Esto también cambia la codificación de cada columna !
Forma rápida: exporte a un archivo SQL, use buscar y reemplazar para cambiar el texto que necesita cambiar. Cree una nueva base de datos, importe los datos y luego cambie el nombre de la base de datos anterior y la nueva por el nombre anterior.
Para cambiar la clasificación de todos los campos en todas las tablas de una base de datos a la vez:
Solo estaba agregando otro bucle para los campos dentro de las tablas a la solución a través de Php antes mencionado. Esto ha ayudado, todos los campos en las tablas también se convierten.
<?php
$con = mysql_connect('localhost','user','pw');if(!$con){ echo "Cannot connect to the database ";die();}
mysql_select_db('database_name');$result=mysql_query('show tables');while($tables = mysql_fetch_array($result)){
foreach ($tables as$key=>$table){//for each table$sql ="ALTER TABLE $table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci";
echo "\n".$sql;
mysql_query($sql);$sql ="show fields in ".$table." where type like 'varchar%' or type like 'char%' or type='text' or type='mediumtext';";$rs2=mysql_query($sql);while($rw2 = mysql_fetch_array($rs2)){//for each field intable$sql ="ALTER TABLE `".$table."` CHANGE `".$rw2['Field']."` `".$rw2['Field']."` ".$rw2['Type']." CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;";
echo "\n".$sql;
mysql_query($sql);}}}
echo "The collation of your database has been successfully changed!";?>}
Respuestas:
Necesita convertir cada tabla individualmente:
(esto también convertirá las columnas), o exporta la base de datos
latin1
e importa de nuevoutf8mb4
.fuente
@rsensan
:CONVERT
también cambiará la clasificación de las columnas.database
CONJUNTO DE CARACTERES POR DEFECTO utf8 DEFAULT COLLATE utf8_general_ci;MYTABLE
CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; Por favor, no uses utf8_general_ci nunca más ;-)Estoy contribuyendo aquí, ya que el OP preguntó:
La respuesta seleccionada simplemente lo indica a nivel de tabla.
Cambiando toda la base de datos:
Cambiándolo por tabla:
Una buena práctica es cambiarlo a nivel de tabla, ya que también lo cambiará por columnas. Cambiar para una columna específica es para cualquier caso específico.
Cambio de intercalación para una columna específica:
fuente
SELECT table_schema , table_name , column_name , COLLATION_NAME , COLUMN_TYPE FROM information_schema.columns WHERE collation_name != 'utf8_general_ci' AND table_schema not in ('information_schema','mysql', 'performance_schema','sys');
Puedes ejecutar un script php.
fuente
Para cambiar la clasificación de tablas individualmente, puede usar,
Para establecer la clasificación predeterminada para toda la base de datos,
si no,
Ir a PhpMyAdmin-> Operaciones-> Colación.
Allí puede encontrar el cuadro de selección que contiene todas las colaciones existentes. Para que aquí puedas cambiar tu colación. Entonces, después de la tabla de la base de datos, seguirá esta clasificación mientras está creando una nueva columna. No es necesario seleccionar intercalación al crear nuevas columnas.
fuente
La siguiente consulta generará consultas ALTER que cambian la clasificación para todas las columnas apropiadas en todas las tablas a un cierto tipo (utf8_general_ci en mi ejemplo a continuación).
fuente
information_schema.tables
y el código en concatALTER TABLE 'schema'.'table' CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_bin ;
Si ejecuta phpMyAdmin >> seleccione la base de datos >> seleccione la tabla >> vaya a la pestaña "Operaciones" >> en la sección "Opciones de la tabla" >> puede elegir la Clasificación en la lista desplegable >> y una vez que presione {Ir} en el en la parte superior de la pantalla verá un mensaje:
y un guion
Pero NO cambiará las colaciones de las columnas existentes. Para hacerlo, puede usar este script (este también vino de phpMyAdmin)
fuente
Puede establecer la clasificación predeterminada en varios niveles:
http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html
1) cliente 2) servidor predeterminado 3) base de datos predeterminada 4) tabla predeterminada 5) columna
fuente
Simplemente ejecute este SQL para convertir todas las tablas de la base de datos a la vez. Cambie su COLLATION y databaseName a lo que necesita.
fuente
Puede cambiar el CHARSET y COLLATION de todas sus tablas mediante el script PHP de la siguiente manera. Me gusta la respuesta de hkasera pero el problema es que la consulta se ejecuta dos veces en cada tabla. Este código es casi el mismo, excepto el uso de MySqli en lugar de mysql y la prevención de consultas dobles. Si pudiera votar, habría votado la respuesta de hkasera.
fuente
CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin
.Simplemente puede agregar este código al archivo de script
fuente
Me sorprendió aprender, así que tuve que volver aquí e informar que el excelente y bien mantenido script Interconnect / it SAFE SEARCH AND REPLACE ON DATABASE tiene algunas opciones para convertir tablas a utf8 / unicode, e incluso para convertir a innodb . Es un script que se usa comúnmente para migrar un sitio web impulsado por una base de datos (Wordpress, Drupal, Joomla, etc.) de un dominio a otro.
fuente
Lo leí aquí, que necesitas convertir cada tabla manualmente, no es cierto. Aquí hay una solución sobre cómo hacerlo con un procedimiento almacenado:
Después de crear el procedimiento, llámelo simplemente:
Para más detalles lee este blog .
fuente
si desea actualizar el juego de caracteres predeterminado en un esquema:
fuente
Usé el siguiente script de shell. Toma el nombre de la base de datos como parámetro y convierte todas las tablas en otro conjunto de caracteres y clasificación (dado por otros parámetros o valores predeterminados definidos en el script).
fuente
Mi solución es una combinación de @Dzintars y @Quassnoi Answer.
Al usar
CONVERT TO
, esto genera una secuencia de comandos, que convierte todas las tablas<your-database>
a la codificación solicitada. ¡Esto también cambia la codificación de cada columna !fuente
Mejor variante para generar script SQL por solicitud SQL. No arruinará los valores predeterminados / nulos.
fuente
Forma rápida: exporte a un archivo SQL, use buscar y reemplazar para cambiar el texto que necesita cambiar. Cree una nueva base de datos, importe los datos y luego cambie el nombre de la base de datos anterior y la nueva por el nombre anterior.
fuente
Para cambiar la clasificación de todos los campos en todas las tablas de una base de datos a la vez:
Solo estaba agregando otro bucle para los campos dentro de las tablas a la solución a través de Php antes mencionado. Esto ha ayudado, todos los campos en las tablas también se convierten.
fuente
Acabo de escribir un script bash para encontrar todas las tablas en una base de datos determinada y encubrirlas (y sus columnas).
El script está disponible aquí: https://github.com/Juddling/mysql-charset
fuente