Un script pour modifier toutes les tables et les champs pour de l'utf-8-classement bin de MYSQL
Est-il un SQL
ou PHP
script que je peux courir qui va changer le classement par défaut dans toutes les tables et tous les champs dans une base de données?
Je peux en écrire un moi-même, mais je pense que cela devrait être quelque chose que facilement disponible à un site comme celui-ci. Si je peux venir avec moi-même avant que quelqu'un les posts, je vais poster moi-même.
Vous devez vous connecter pour publier un commentaire.
Être prudent! Si vous avez réellement utf stocké comme un autre encodage, vous pouvez avoir un réel désordre sur vos mains. Sauvegarder d'abord. Ensuite, essayez l'une des méthodes standard:
par exemple
http://www.cesspit.net/drupal/node/898
http://www.hackszine.com/blog/archive/2007/05/mysql_database_migration_latin.html
J'ai eu recours à la conversion de tous les champs de texte en binaire, puis retour à varchar/texte. Ce qui a sauvé mon cul.
J'avais de données est UTF8, stockées sous forme de latin1. Ce que j'ai fait:
De supprimer les index.
Convertir des champs en binaire.
Convertir en utf8-general ci
Si votre LAMPE, ne pas oublier d'ajouter le nom de l'ensemble de commande avant d'avoir des relations avec la db, et assurez-vous de définir l'encodage des caractères en-têtes.
Peut être fait en une seule commande (plutôt que de 148 PHP):
Vous avez obtenu d'aimer la ligne de commande...
(Vous devrez peut-être employer le
--user
et--password
options pourmysql
).EDIT: pour éviter de clé étrangère problèmes, ajoutés
SET foreign_key_checks = 0;
etSET foreign_key_checks = 1;
"SHOW TABLES"
avec"SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'"
. Nécessite MySQL 5.0.2 ou plus.mysql -u root -ppassword --database=dbname -B -N -e "SHOW TABLES" | awk '{print "SET foreign_key_checks = 0; ALTER TABLE", $1, "CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; SET foreign_key_checks = 1; "}' | mysql -u root -ppassword --database=dbname &
Je pense que c'est facile de faire ça en deux étapes runin PhpMyAdmin.
Étape 1:
Étape 2:
Cette requête affichera une liste de requêtes, une pour chaque table. Vous devez copier la liste de requêtes et de les coller à la ligne de commande ou via PhpMyAdmin SQL onglet pour que les modifications soient effectuées.
OK, j'ai écrit ça en tenant compte de ce qui a été dit dans ce fil. Merci pour l'aide, et j'espère que ce script va aider les autres. Je n'ai pas de garantie pour son utilisation, donc faites une SAUVEGARDE avant de l'exécuter. Il devrait travailler avec toutes les bases de données; et il a très bien fonctionné sur mon propre.
EDIT: Ajout de vars au top pour ce qui charset/assembler convertir.
EDIT2: les Modifications de la base de données et des tables de jeu de caractères par défaut/assembler
Ce bout de code PHP va modifier le classement sur toutes les tables dans une base de données. (Il est pris de ce site.)
Une autre approche utilisant la ligne de commande, basée sur @david sans
awk
embellie
--silent
pour la premièremysql
de commande pour éviter d'avoir une erreur à la première ligne, qui estTables_in_xxx
. Aussi, échapper à la table de noms d'éviter une erreur sur les tables à l'aide d'un nom réservé (commeOrder
).Une version plus complète du script ci-dessus peuvent être trouvés ici:
http://www.zen-cart.com/index.php?main_page=product_contrib_info&products_id=1937
Merci de laisser vos commentaires au sujet de cette contribution ici:http://www.zen-cart.com/forum/showthread.php?p=1034214
Jeu de caractères et la collation ne sont pas la même chose. Un classement est un ensemble de règles sur la façon de trier les chaînes. Un jeu de caractères est un ensemble de règles sur la façon de représenter les caractères. Un classement dépend du jeu de caractères.
Dans les scripts ci-dessus toutes les tables sélectionnées pour la convertation (avec
SHOW TABLES
), mais le plus commode et portatif de façon à vérifier le tableau de classement avant de convertir un tableau. Cette requête est-il:Utiliser mon custom shell collatedb, cela devrait fonctionner :
Exemple :
Merci @nlaq pour le code, qui m'a lancé sur le dessous de solution.
J'ai sorti un plugin WordPress sans se rendre compte que WordPress ne définissez pas les assembler automatiquement. Donc, beaucoup de personnes utilisant le plugin fini avec
latin1_swedish_ci
quand il aurait dû êtreutf8_general_ci
.Voici le code que j'ai ajouté le plugin pour détecter la
latin1_swedish_ci
rassembler et de le modifier pourutf8_general_ci
.Tester ce code avant de l'utiliser dans votre propre plugin!
Un simple (muet? 🙂 la solution, en utilisant la multi-sélection de la fonctionnalité de Votre environnement de développement:
Voici une façon facile de le faire avec phpmyadmin si vous n'avez pas de ligne de commande d'accès ou l'accès à modifier INFORMATION_SCHEMA.
Tout d'abord, écoutez les conseils de beaucoup d'autres réponses ici - vous pouvez vraiment à vis des choses ici, afin de faire une sauvegarde. Maintenant, faites une sauvegarde de votre sauvegarde. Aussi, il est peu probable de travailler si vos données sont codées différemment de ce que vous modifiez à.
Noter que vous aurez besoin de trouver le nom exact de la délinquance et de schéma de codage de caractères que vous avez besoin de changer avant de commencer.
C'est un moyen super facile à faire, mais encore une fois, cela ne va pas changer l'encodage de vos données, donc il ne fonctionne que dans certaines circonstances.
Je pense que le moyen le plus rapide est avec phpmyadmin et certains jQuery sur console.
Allez à la structure de la table et ouvrez google chrome/firefox developer console (normalement F12 sur le clavier):
d'exécuter ce code pour sélectionner tous les champs avec les mauvais jeu de caractères et de commencer à modifier:
lorsque la page est chargée, utilisez ce code sur la console pour sélectionner l'encodage correct:
enregistrer
de modifier la table de jeu de caractères sur "Classement" sur le terrain "Fonctionnement" de l'onglet
Testé sur phpmyadmin 4.0 et 4.4, mais je pense que le travail sur les 4.versions x
J'ai mis à jour nlaq la réponse de travailler avec PHP7 et à gérer correctement les colonnes d'indices, binaire assemblées de données (par exemple,
latin1_bin
), etc., et de nettoyer un peu le code. C'est le seul code que j'ai trouvé/essayé avec succès migré ma base de données à partir de latin1 pour l'utf8.Pour Les Utilisateurs De Windows
En plus de @davidwinterbottom réponse,
les utilisateurs de windows peuvent utiliser la commande ci-dessous:
Remplacer [base de données], [utilisateur] et [mot de passe] des espaces réservés à valeurs réelles.
Git-bash les utilisateurs peuvent télécharger cette script bash et l'exécuter facilement.