Μετακίνηση βάσεων δεδομένων MySQL: μετατροπή latin1 σε utf8 - 💡 Fix My Ideas

Μετακίνηση βάσεων δεδομένων MySQL: μετατροπή latin1 σε utf8

Μετακίνηση βάσεων δεδομένων MySQL: μετατροπή latin1 σε utf8


Συγγραφέας: Ethan Holmes, 2019

Μέχρι την έκδοση 4.1, οι πίνακες MySQL κωδικοποιήθηκαν με το σύνολο χαρακτήρων latin1. Από προεπιλογή, το σύνολο χαρακτήρων είναι πλέον utf8. Αυτό είναι καλό από την άποψη της μη λατινικής υποστήριξης χαρακτήρων, αλλά αν κάνετε αναβάθμιση από μια παλαιότερη βάση δεδομένων, μπορεί να τρέξετε σε πολλά προβλήματα κωδικοποίησης χαρακτήρων.

Πρόσφατα μετέφερα αρκετές παλαιότερες βάσεις δεδομένων από 4.0 σε MySQL 5 και μετέτρεψα μερικούς πίνακες από latin1 σε utf8 και έχω βάλει μαζί μερικά κόλπα που θα μπορούσαν να σας βοηθήσουν μέσω του ίδιου. Μέχρι στιγμής, έχω βασικά τρέξει σε τρία βασικά ζητήματα: μετατροπή ενός πίνακα από το latin1 charset σε utf8, αναβάθμιση ολόκληρου του συνόλου βάσεων δεδομένων που εξαργυρώθηκε σωστά με το mysqldump και (το χειρότερο) μετεγκατάσταση ενός ολόκληρου συνόλου αρχείων MYI και MYD της βάσης δεδομένων που δεν εξήχθησαν σωστά.

Μετατροπή ενός latin1 πίνακα σε utf8 Αν έχετε ήδη μεταναστεύσει με επιτυχία στη νέα έκδοση MySQL, αλλά έχετε έναν παλαιότερο κωδικοποιημένο πίνακα latin1 και απλά θέλετε να αλλάξετε το χαρακτήρα χαρακτήρων του σε utf8, είναι μια αρκετά απλή άσκηση. Πρώτον, εξαγάγετε τον πίνακα με το mysqldump:

mysqldump -u username -p βάση δεδομένων --default-character-set = latin1 πίνακας> tableoutput.sql

Πρώτα δημιουργήστε ένα αντίγραφο ασφαλείας αυτού του αρχείου και απλά επεξεργαστείτε το για να ρυθμίσετε δύο πράγματα. Βρείτε τη γραμμή που περιέχει το "SET NAMES latin1" και αλλάξτε το σε "SET NAMES utf8". Στη συνέχεια, εξετάστε τον ορισμό του πίνακα και αλλάξτε την επιλογή "DEFAULT CHARSET = latin1" σε "DEFAULT CHARSET = utf8". Τέλος, επανεισάγετε τον πίνακα:

cat tableoutput.sql | mysql --default-χαρακτήρα-set = utf8 -u username -p βάση δεδομένων

Όταν εισάγεται ξανά, θα δημιουργηθεί σωστά ως πίνακας utf8 και δεν θα πρέπει να έχετε προβλήματα κωδικοποίησης χαρακτήρων. Μπορείτε να το κάνετε αυτό για μια ολόκληρη βάση δεδομένων με την ίδια τεχνική και χρησιμοποιώντας μια αναζήτηση και αντικατάσταση για να μεταβείτε στο latin1 στο utf8.

Αναβάθμιση ολόκληρου του συνόλου βάσεων δεδομένων που εξάγεται σωστά με το mysqldump Αυτό είναι ένα αρκετά απλό σενάριο. Έχετε εξάγει όλη την βάση δεδομένων σας από την προηγούμενη έκδοση MySQL με κάτι σαν αυτό:

mysqldump - προεπιλεγμένο σύνολο χαρακτήρων = latin1 -u username -p βάση δεδομένων> dboutput.sql

Στη συνέχεια, μπορείτε να την εισαγάγετε είτε ως λατινικό1 πίνακα, είτε να το μετατρέψετε σε utf8 όπως προηγουμένως. Απλά φροντίστε να ρυθμίσετε σωστά τις τιμές "SET NAMES" και "CHARACTER SET" και ρυθμίστε την παράμετρο "-default-set-set" σε utf8 ή latin1, ανάλογα με την περίπτωση.

Σημειώστε ότι το προεπιλεγμένο σύνολο χαρακτήρων είναι πλέον utf8 εκτός αν το αλλάξετε στο αρχείο my.cnf. Έχω βρεθεί σε συστήματα όπου έχει οριστεί σε latin1 για λόγους συμβατότητας, ωστόσο, έτσι δεν μπορείτε απλώς να το υποθέσετε αυτό. Βεβαιωθείτε ότι όλος ο κωδικός βάσης δεδομένων σας (στο php, perl, οτιδήποτε) εκδίδει τη δήλωση SQL "SET NAMES utf8" πριν εκδώσει περαιτέρω εντολές SQL. Αυτό θα διασφαλίσει ότι ό, τι ρυθμίζετε σε INSERTS και λαμβάνετε σε SELECT δεν είναι εσφαλμένα κωδικοποιημένο. Αν χρησιμοποιείτε παλαιό πίνακα latin1, βεβαιωθείτε ότι κάνετε το ίδιο, αλλά με τη ρύθμιση latin1.

Μετεγκατάσταση ολόκληρου του συνόλου των αρχείων MYI και MYD της βάσης δεδομένων που δεν είχαν εξαχθεί σωστά Είχα μια οντότητα την άλλη μέρα και δεν εξήγαγα σωστά μία από τις βάσεις δεδομένων του διακομιστή μου πριν την αναβάθμιση σε MySQL 5. Μετά την αναβάθμιση όλες οι βάσεις μου ήταν κατεστραμμένες , συμπεριλαμβανομένης της βάσης δεδομένων mysql, πράγμα που σημαίνει ότι δεν μπορούσα να συνδεθώ. Η εντολή mysql_upgrade δεν έβλεπε τα πράγματα σωστά και όλα ήταν επειδή η MySQL υπολόγισε ότι οι πίνακες μου από την παλαιότερη έκδοση κωδικοποιήθηκαν στο utf8.

Ήταν, όπως, ένας καταιγισμός.

Δεν ξέρω αν υπάρχει ένας ευκολότερος τρόπος, αλλά έτσι κατάφερα να μεταφέρω όλα αυτά τα αρχεία MYI και MYD στη νέα βάση δεδομένων, χωρίς να επιστρέψω στην παλαιότερη έκδοση και να τα εξάγω σωστά.

Πρώτον, πρέπει να αλλάξετε το mysql config έτσι ώστε όταν φορτώνει τις παλιές βάσεις δεδομένων σας υποθέτει ότι είναι latin1 encoded. Για να το κάνετε αυτό, επεξεργαστείτε το αρχείο my.cnf. Βρείτε όλες τις γραμμές που λένε "default-character-set = utf8" και αλλάξτε όλες τις λέξεις "default-character-set = latin1".

Ξεκινήστε το mysqld και να το αγνοήσετε τα δικαιώματα:

mysqld_safe - skip-grant-tables &

Τώρα, εκτελέστε "mysql_upgrade". Όταν τελειώσει, κάντε ένα SELECT στον πίνακα mysql.user. Θα πρέπει να δείτε ότι τα ονόματα χρηστών και οι κωδικοποιημένοι κωδικοί πρόσβασης δεν έχουν περικοπεί στο μισό και έχουν αντικατασταθεί με gobbledeguk.

Σκοτώστε και επανεκκινήστε τον εξυπηρετητή mysql. Θα πρέπει να είστε σε θέση να συνδεθείτε, δηλαδή ο πίνακας χρηστών mysql είναι, στην πραγματικότητα, άθικτο. Θα διαπιστώσετε ότι όλα τα άλλα σας τραπέζια είναι επίσης καλά. Ένα πράγμα που μπορεί να παρατηρήσετε είναι ότι το σενάριο mysql_upgrade θα έχει ενημερώσει τις βάσεις δεδομένων mysql για να χρησιμοποιήσει utf8. Όλες οι άλλες βάσεις δεδομένων σας παραμένουν στη latin1, ωστόσο, θα χρειαστεί να τις μετατρέψετε σε utf8 (εάν το επιθυμείτε) χρησιμοποιώντας τις παραπάνω οδηγίες. Επίσης, εάν δεν χρειάζεστε υποστήριξη παλαιού τύπου για παλαιότερες εφαρμογές, θα πρέπει πιθανότατα να επιστρέψετε στο αρχείο my.cnf και να αλλάξετε το προεπιλεγμένο σύνολο χαρακτήρων πίσω στο utf8 για όλα.

Οι σκέψεις σας Από αυτό το σημείο προς τα εμπρός, όλοι θα πρέπει να χρησιμοποιούν το utf8 σε όλη τη διαδρομή, αλλά φαίνεται ότι το άλμα είναι πιο οδυνηρό από ό, τι θα έπρεπε. Αν γνωρίζετε καλές συμβουλές και κόλπα κωδικοποίησης χαρακτήρων MySQL, βοηθήστε τον συνάδελφό σας χάκερ. Μοιραστείτε τα σχόλια!



Μπορεί Να Σας Ενδιαφέρει

Το δικό σου Holodeck; Το castar το φέρνει στο εσωτερικό του

Το δικό σου Holodeck; Το castar το φέρνει στο εσωτερικό του


Αισθητήρες ποιότητας αέρα: Πόσο καλό είναι καλό;

Αισθητήρες ποιότητας αέρα: Πόσο καλό είναι καλό;


100 τρόποι για να κάνουν το Faire Maker όλο το χρόνο

100 τρόποι για να κάνουν το Faire Maker όλο το χρόνο


Εξάγοντας τα κλειδιά κρυπτογράφησης μετά από μια κρύα εκκίνηση

Εξάγοντας τα κλειδιά κρυπτογράφησης μετά από μια κρύα εκκίνηση