Πώς φαίνεται το πρόβλημα
Πριν
INSERT INTO wp_posts (post_title) VALUES ('ÊáëÜ ×ñéóôïýãåííá – ÁèÞíá, ÐÜôñá');Μετά
INSERT INTO wp_posts (post_title) VALUES ('Καλά Χριστούγεννα – Αθήνα, Πάτρα');Από πού προέρχεται
Το WordPress αποθηκεύει το κείμενο ως UTF-8. Πολλές παλιότερες εγκαταστάσεις όμως δημιούργησαν τους πίνακες ως latin1 ή συνδέθηκαν με latin1. Όσο η εγγραφή και η ανάγνωση κάνουν το ίδιο λάθος, κανείς δεν το προσέχει. Μετά τη μεταφορά σε νέο διακομιστή, την εξαγωγή με phpMyAdmin ή την αλλαγή της κωδικοποίησης σύνδεσης, κάθε ελληνικό γράμμα γίνεται ξαφνικά δύο χαρακτήρες.
- Το
DB_CHARSETστοwp-config.phpείναιlatin1ή δεν ταιριάζει με τους πίνακες. - Το dump εξήχθη ως
latin1και εισήχθη ωςutf8mb4– ή αντίστροφα. - Ένα πρόσθετο ή ένα script εισαγωγής μετέτρεψε ξανά ήδη χαλασμένο κείμενο. Έτσι προκύπτει διπλά κωδικοποιημένο κείμενο.
Διορθώστε την εξαγωγή
- Κάντε αντίγραφο ασφαλείας της βάσης πριν αλλάξετε οτιδήποτε.
- Εξαγάγετε τους επηρεασμένους πίνακες ως αρχείο
.sql, για παράδειγμα με phpMyAdmin ή μεmysqldump --default-character-set=utf8mb4. - Αφήστε το αρχείο στο πεδίο παραπάνω. Το Mojibuster διορθώνει μόνο τα χαλασμένα σημεία και σας δείχνει κάθε αλλαγή.
- Κατεβάστε το διορθωμένο αρχείο και εισαγάγετέ το με
utf8mb4σε μια νέα βάση δοκιμών. - Ελέγξτε τον ιστότοπο. Αν όλα φαίνονται σωστά, εισαγάγετέ το στην παραγωγική βάση.
Το dump δεν ανεβαίνει ποτέ πουθενά – κάτι σημαντικό, γιατί συνήθως περιέχει λογαριασμούς χρηστών, διευθύνσεις e-mail και σχόλια. Περισσότερα για επιχειρήσεις και υπεύθυνους προστασίας δεδομένων.
Προσοχή στα σειριοποιημένα δεδομένα
Το WordPress αποθηκεύει ορισμένες ρυθμίσεις στα wp_options και wp_postmeta ως σειριοποιημένες τιμές PHP, όπως s:10:"Αθήνα";. Ο αριθμός είναι το μήκος σε byte. Όταν το Ξ± γίνει ξανά α, δεν ταιριάζει πια και το WordPress απορρίπτει την τιμή. Διορθώστε λοιπόν πρώτα τους πίνακες περιεχομένου όπως wp_posts, wp_comments και wp_terms. Για τις ρυθμίσεις το wp search-replace του WP-CLI είναι το καλύτερο εργαλείο, γιατί ενημερώνει τα μήκη.
Λύστε την αιτία στη MySQL
- Αλλάξτε τους πίνακες και τη σύνδεση σε
utf8mb4και ορίστεdefine('DB_CHARSET', 'utf8mb4');στοwp-config.php. - Αν μια στήλη
latin1περιέχει byte UTF-8, μην τη μετατρέψετε απευθείας – θα κωδικοποιηθεί για δεύτερη φορά. Η συνήθης διαδρομή περνά από δυαδικό τύπο: πρώταMODIFY … LONGBLOB, μετάMODIFY … LONGTEXT CHARACTER SET utf8mb4. - Δοκιμάστε κάθε αλλαγή πρώτα σε αντίγραφο της βάσης.
Συχνές ερωτήσεις
Μπορώ να διορθώσω ολόκληρη τη βάση του WordPress με τη μία;
Ναι, ακόμη και μεγάλα dumps SQL. Προσέξτε όμως τα σειριοποιημένα δεδομένα στα wp_options και wp_postmeta – το WP-CLI τα χειρίζεται καλύτερα.
Αλλάζουν οι σωστοί χαρακτήρες στο dump;
Όχι. Το Mojibuster διορθώνει μόνο ακολουθίες που είναι σαφώς χαλασμένες. Το σωστό κείμενο μένει ως έχει.
Ποια η διαφορά ανάμεσα στο utf8 και στο utf8mb4;
Στη MySQL το utf8 αποθηκεύει μόνο χαρακτήρες έως τρία byte, οπότε τα emoji χάνονται. Το utf8mb4 είναι πραγματικό UTF-8 και η σωστή επιλογή για το WordPress.
Λειτουργεί και σε άλλα συστήματα εκτός από το WordPress;
Ναι. Το Joomla, το Drupal, το Magento ή η δική σας εφαρμογή σε MySQL ή MariaDB έχουν το ίδιο πρόβλημα και την ίδια λύση.