web-dev-qa-db-fra.com

Comment changer le classement de la base de données, table, colonne?

La base de données est maintenant latin1_general_ci et je souhaite modifier le classement en utf8mb4_general_ci.

Existe-t-il un paramètre dans PhpMyAdmin pour modifier le classement de la base de données, table, colonne? Plutôt que de changer un par un?

164
user158469

Vous devez soit convertir chaque table individuellement:

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 

(cela convertira également les colonnes), ou exportez la base de données avec latin1 et importez-la avec utf8mb4.

221
Quassnoi

Je contribue ici, comme l’a demandé le PO:

Comment changer le classement de la base de données, table, colonne?

La réponse sélectionnée l'indique simplement au niveau de la table.


Changer la base de données à l'échelle:

ALTER DATABASE <database_name> CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Le changer par table:

ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

La bonne pratique consiste à le modifier au niveau de la table, car cela le modifiera également pour les colonnes. Changer pour une colonne spécifique est pour n'importe quel cas spécifique.

Modification du classement pour une colonne spécifique:

ALTER TABLE <table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci;
120
Nabeel Ahmed

Vous pouvez exécuter 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!";
                ?>
62
hkasera

Pour modifier le classement des tables individuellement, vous pouvez utiliser,

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8

Pour définir le classement par défaut pour toute la base de données,

ALTER DATABASE  `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

ou sinon, 

Allez à PhpMyAdmin-> Opérations-> Collation.  

Vous y trouverez la zone de sélection contenant tous les classements existants. Pour qu'ici vous puissiez changer votre classement. Donc, voici la table de base de données qui suit ce classement pendant que vous créez une nouvelle colonne. Pas besoin de sélectionner le classement lors de la création de nouvelles colonnes.

37
jeeva

vous pouvez définir le classement par défaut à plusieurs niveaux:

http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html

1) client 2) serveur par défaut 3) base de données par défaut 4) table par défaut 5) colonne

9
andersonbd1

La requête suivante générera des requêtes ALTER qui modifient le classement de toutes les colonnes appropriées de toutes les tables en un certain type (utf8_general_ci dans mon exemple ci-dessous).

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 IS NOT NULL AND
    t1.COLLATION_NAME NOT IN ('utf8_general_ci');
9
Parampal Pooni

Si vous utilisez phpMyAdmin >> sélectionner la base de données >> sélectionner la table >> allez dans l'onglet "Opérations" >> de la section "Options de la table" >> vous pouvez choisir le classement dans la liste déroulante >> et une fois que vous avez appuyé sur {OK} En haut de l'écran, vous verrez un message: 

Votre requête SQL a été exécutée avec succès 

et un script 

ALTER TABLE `tableName` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci 

Mais cela ne changera PAS les classements des colonnes existantes ..__ Pour ce faire, vous pouvez utiliser ce script (celui-ci provient également de phpMyAdmin)

ALTER TABLE  `tableName` CHANGE  `Name`  `Name` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
9
Yevgeniy Afanasyev

J'ai été surpris d'apprendre, et j'ai donc dû revenir ici et signaler que le script excellent et bien entretenu Interconnect/it SAFE SEARCH AND REPLACE ON DATABASE offre certaines options pour convertir les tables en utf8/unicode et même pour convertir en innodb. . C'est un script couramment utilisé pour migrer un site Web géré par une base de données (Wordpress, Drupal, Joomla, etc.) d'un domaine à un autre.

 interconnect script buttons

4
Adam Nofsinger

Vous pouvez modifier le CHARSET et la COLLATION de toutes vos tables avec le script PHP comme suit. J'aime la réponse de hkasera, mais le problème est que la requête est exécutée deux fois sur chaque table. Ce code est presque le même, à l'exception de l'utilisation de MySqli à la place de mysql et de la prévention des doubles requêtes. Si je pouvais voter, j'aurais voté la réponse 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();

?>
3
mtmehdi

Vous pouvez simplement ajouter ce code au fichier 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!";
3
Chandra Kumar

Je l'ai lu ici, que vous devez convertir chaque table manuellement, ce n'est pas vrai. Voici une solution pour le faire avec une procédure stockée:

DELIMITER $$

DROP PROCEDURE IF EXISTS changeCollation$$

-- character_set parameter could be 'utf8'
-- or 'latin1' or any other valid character set
CREATE PROCEDURE changeCollation(IN character_set VARCHAR(255))
BEGIN
DECLARE v_finished INTEGER DEFAULT 0;
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 parameter

DECLARE alter_cursor CURSOR FOR SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
AND COLLATION_NAME NOT LIKE CONCAT(character_set, '_%');

-- This handler will set the value v_finished to 1
-- if there are no more rows

DECLARE CONTINUE HANDLER
FOR NOT 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 one
FETCH alter_cursor INTO v_table_name;

-- If there is no more record, then we have to skip
-- the commands inside the loop
IF v_finished = 1 THEN
LEAVE get_table;
END IF;

IF v_table_name != '' THEN

IF v_message = 'No records' THEN
SET v_message = '';
END IF;

-- 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 loop

SET @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 = '';

END IF;
-- Close the loop and the cursor
END LOOP get_table;
CLOSE alter_cursor;

-- Returns information about the altered tables or 'No records'
SELECT v_message;

END $$

DELIMITER ;

Une fois la procédure créée, appelez-la simplement: 

CALL changeCollation('utf8');

Pour plus de détails, lisez ceci blog .

3
András Ottó

si vous souhaitez mettre à jour le jeu de caractères par défaut sur un schéma:

 ALTER SCHEMA MYSCHEMA DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci;
2
Mircea Stanciu

Il suffit de lancer ce SQL. Changez votre COLLATION en ce dont vous avez besoin et nomdonnées.

SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME," COLLATE utf8_general_ci;") AS    ExecuteTheString
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="databaseName"
AND TABLE_TYPE="BASE TABLE";
1
Dzintars

J'ai utilisé le script shell suivant. Il prend le nom de base de données en tant que paramètre et convertit toutes les tables en un autre jeu de caractères et en un autre classement (donné par un autre paramètre ou la valeur par défaut définie dans le script).

#!/bin/bash

# mycollate.sh <database> [<charset> <collation>]
# changes MySQL/MariaDB charset and collation for one database - all tables and
# all columns in all tables

DB="$1"
CHARSET="$2"
COLL="$3"

[ -n "$DB" ] || exit 1
[ -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 | (
    while read TABLE; do
        echo $DB.$TABLE
        echo "ALTER TABLE $TABLE CONVERT TO CHARACTER SET $CHARSET COLLATE $COLL;" | mysql $DB
    done
)
1
Petr Stastny

Méthode rapide - exporter vers un fichier SQL, utilisez les fonctions de recherche et remplacement pour modifier le texte à modifier. Créez une nouvelle base de données, importez les données, puis renommez l'ancienne base de données et la nouvelle en l'ancien.

0
kickoff3pm

Ma solution est une combinaison de @Dzintars et @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";

En utilisant CONVERT TO, cela génère un script qui convertit toutes les tables de <your-database> au codage demandé. Cela change également l'encodage de chaque colonne !

0
Florian Kirmaier

Je viens d'écrire un script bash pour trouver toutes les tables d'une base de données donnée et les convertir (et ses colonnes).

Le script est disponible ici: https://github.com/Juddling/mysql-charset

0
Juddling