Τρία σημεία όπου η MySQL θέλει κωδικοποίηση
- Στήλη ή πίνακας: το σύνολο χαρακτήρων αποθήκευσης, π.χ.
utf8mb4,latin1ή το παλιό ελληνικόgreek(ISO-8859-7). - Σύνδεση: το σύνολο χαρακτήρων που χρησιμοποιούν πελάτης και διακομιστής – ορίζεται με
SET NAMES utf8mb4ή στις ρυθμίσεις σύνδεσης. - Αρχείο: η κωδικοποίηση με την οποία διαβάζεται μια εισαγωγή ή γράφεται μια εξαγωγή – στο phpMyAdmin στο πεδίο Σύνολο χαρακτήρων του αρχείου.
Αν τα τρία δεν ταιριάζουν, οι χαρακτήρες χαλούν. Η πιο συχνή περίπτωση: ελληνικό κείμενο UTF-8 γράφεται μέσω σύνδεσης latin1 σε στήλη latin1. Τα γράμματα που δεν υπάρχουν στο latin1 γίνονται ? και χάνονται οριστικά. Όσα περνούν σώνονται, αλλά το phpMyAdmin και η εξαγωγή δείχνουν αβ.
Πριν
"1","Ãéþñãïò Ðáðáäüðïõëïò","Ëåùöüñïò Áèçíþí 12","Èåóóáëïíßêç"
Μετά
"1","Γιώργος Παπαδόπουλος","Λεωφόρος Αθηνών 12","Θεσσαλονίκη"
Ελέγξτε τα σύνολα χαρακτήρων
- Το
SHOW VARIABLES LIKE 'character_set%';δείχνει τις ρυθμίσεις διακομιστή και σύνδεσης. - Το
SHOW CREATE TABLE pelates;δείχνει το σύνολο χαρακτήρων του πίνακα και των στηλών. - Το
SELECT onoma, HEX(onoma) FROM pelates LIMIT 5;δείχνει τα πραγματικά byte: σε στήληutf8mb4τοCEB1είναι έναα, ενώ τοC38EC2B1είναι ήδη χαλασμένοα.
Επισκευή εξαγωγής ή dump
- Εξαγάγετε τον πίνακα από το phpMyAdmin ως SQL ή CSV – ή με
mysqldump --default-character-set=utf8mb4. - Ρίξτε το αρχείο στο πλαίσιο παραπάνω. Το Mojibuster επισκευάζει μόνο τα χαλασμένα σημεία· οι σωστοί χαρακτήρες μένουν ως έχουν.
- Ελέγξτε τα επισκευασμένα σημεία στο Τι άλλαξε; και κατεβάστε το αρχείο.
- Εισαγάγετέ το σε πίνακα
utf8mb4και επιλέξτεutf-8ως σύνολο χαρακτήρων στο παράθυρο εισαγωγής. - Δοκιμάστε πρώτα σε αντίγραφο, πριν αντικαταστήσετε τον πραγματικό πίνακα.
Η εξαγωγή δεν φεύγει ποτέ από τον υπολογιστή σας – κάτι σημαντικό για δεδομένα πελατών. Αν έχετε εξαγάγει CSV και το ανοίγετε στο Excel, δείτε και το Excel και ελληνικά.
Διορθώστε την αιτία
- Δημιουργήστε νέους πίνακες με
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci. Η σύγκριση αγνοεί τους τόνους, ώστε τοάκαι τοανα ταιριάζουν στην αναζήτηση. - Ορίστε τη σύνδεση της εφαρμογής σε
utf8mb4, στην PHP π.χ. μεcharset=utf8mb4στο DSN της PDO. - Αν byte UTF-8 βρίσκονται σε στήλη
latin1, μην τη μετατρέψετε απευθείας μεCONVERT TO– κωδικοποιεί το κείμενο δεύτερη φορά και δημιουργεί διπλή κωδικοποίηση. Ο ασφαλής δρόμος περνά από δυαδικό τύπο: πρώταMODIFY onoma VARBINARY(255), μετάMODIFY onoma VARCHAR(255) CHARACTER SET utf8mb4. - Αν η MySQL αντικαθιστά χαρακτήρες με
?, η στήλη ή η σύνδεση δεν μπορεί να τους αναπαραστήσει. Ό,τι έχει ήδη αποθηκευτεί έτσι έχει χαθεί – περισσότερα στο Τι είναι το mojibake.
Συχνές ερωτήσεις
Γιατί στην εφαρμογή μου όλα φαίνονται σωστά, αλλά στο phpMyAdmin όχι;
Επειδή η εφαρμογή και η βάση κάνουν το ίδιο λάθος δύο φορές: η εφαρμογή γράφει UTF-8 μέσω σύνδεσης latin1 και το διαβάζει πίσω με τον ίδιο τρόπο. Το phpMyAdmin συνδέεται σωστά και γι' αυτό δείχνει ό,τι είναι πραγματικά αποθηκευμένο. Αν ολόκληρη η εξαγωγή WordPress δείχνει Ξ±, βοηθά η σελίδα WordPress και βάση δεδομένων, και αν το σφάλμα υπάρχει ήδη σε διπλή κωδικοποίηση, μπορείτε να διορθώσετε και τα δύο επίπεδα μαζί.
Ποιο collation να διαλέξω;
Το utf8mb4_unicode_ci ταιριάζει στις περισσότερες εφαρμογές· από τη MySQL 8 προεπιλογή είναι το utf8mb4_0900_ai_ci. Πιο σημαντικό είναι το σύνολο χαρακτήρων utf8mb4 – όχι το utf8, που στη MySQL δεν αποθηκεύει emoji.
Λειτουργεί και με MariaDB;
Ναι. Η MariaDB χειρίζεται τα σύνολα χαρακτήρων όπως η MySQL και οι εντολές είναι ίδιες.
Πόσο μεγάλο μπορεί να είναι το dump;
Έως 100 MB ανά αρχείο. Τις μεγαλύτερες βάσεις εξαγάγετέ τες πίνακα πίνακα.