103 votes

Comment convertir toutes les tables de la base de données en une seule collation ?

Je reçois une erreur :

Mélange illégal de collations (utf8_general_ci,IMPLICIT) et (utf8_unicode_ci,IMPLICIT) pour l'opération '='".

J'ai essayé de changer manuellement les deux tables en utf8_general_ci,IMPLICIT mais je reçois toujours l'erreur.

Existe-t-il un moyen de convertir toutes les tables en utf8_general_ci,IMPLICIT et en finir avec ça ?

1voto

Xdg Points 429

Si vous voulez un copier-coller bash script :

var=$(mysql -e 'SELECT CONCAT("ALTER TABLE ", TABLE_NAME," CONVERT TO CHARACTER SET utf8 COLLATE utf8_czech_ci;") AS execTabs FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA="zabbix" AND TABLE_TYPE="BASE TABLE"' -uroot -p )

var+='ALTER DATABASE zabbix CHARACTER SET utf8 COLLATE utf8_general_ci;'

echo $var | cut -d " " -f2- | mysql -uroot -p zabbix

Remplacez zabbix par le nom de votre base de données.

0voto

Jin Lim Points 77

Je vais partager ma réponse en utilisant la procédure MySQL. Vous devez exécuter 3 commandes sql.

1.

DROP PROCEDURE IF EXISTS UpdateTable;

2.

DELIMITER $$

CREATE PROCEDURE UpdateTable()
BEGIN

    DECLARE done INT DEFAULT FALSE;
    DECLARE _table_name CHAR(255);
    DECLARE cur CURSOR FOR
            SELECT table_name FROM information_schema.tables
            WHERE table_schema = 'my_db_name' AND table_type = "BASE TABLE";
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur;
    My_loop: LOOP
        FETCH cur INTO _table_name;
        SET @my_table_name = _table_name;

        IF done THEN
          LEAVE My_loop;
        END IF;

        SET FOREIGN_KEY_CHECKS = 0;

        SET @stmt = CONCAT('ALTER TABLE ', @my_table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'); 
        PREPARE stmt1 FROM @stmt; 
        EXECUTE stmt1; 
        DEALLOCATE PREPARE stmt1;   

        SET FOREIGN_KEY_CHECKS = 1;

    END LOOP;
    CLOSE cur;

END$$

DELIMITER ;

3.

CALL UpdateTable();

Puis refaire le premier. Si vous ne voulez pas stocker la procédure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X