Διόρθωση των ελληνικών χαρακτήρων σε MySQL και phpMyAdmin

Το phpMyAdmin, το SQL dump ή η εφαρμογή σας δείχνουν αβ, Ξ±Ξ² ή ??? αντί για αβ; Συνήθως ο πίνακας, η σύνδεση και η εισαγωγή δεν ταιριάζουν μεταξύ τους. Το Mojibuster επισκευάζει τις εξαγωγές απευθείας στον browser σας – και μετά ρυθμίζετε σωστά τη MySQL μια για πάντα.

Λειτουργεί με κείμενο και με αυτά τα αρχεία:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

Για παράδειγμα εξαγωγές από το Excel, αντίγραφα ασφαλείας βάσεων δεδομένων, υπότιτλοι και κώδικας ιστοσελίδων.

Διόρθωση

  1. Σύρετε ένα αρχείο ή επικολλήστε κείμενο
  2. Η διόρθωση γίνεται αυτόματα
  3. Αντιγράψτε ή κατεβάστε το αποτέλεσμα
ή σύρετε το αρχείο εδώ

Τρία σημεία όπου η MySQL θέλει κωδικοποίηση

  • Στήλη ή πίνακας: το σύνολο χαρακτήρων αποθήκευσης, π.χ. utf8mb4, latin1 ή το παλιό ελληνικό greek (ISO-8859-7).
  • Σύνδεση: το σύνολο χαρακτήρων που χρησιμοποιούν πελάτης και διακομιστής – ορίζεται με SET NAMES utf8mb4 ή στις ρυθμίσεις σύνδεσης.
  • Αρχείο: η κωδικοποίηση με την οποία διαβάζεται μια εισαγωγή ή γράφεται μια εξαγωγή – στο phpMyAdmin στο πεδίο Σύνολο χαρακτήρων του αρχείου.

Αν τα τρία δεν ταιριάζουν, οι χαρακτήρες χαλούν. Η πιο συχνή περίπτωση: ελληνικό κείμενο UTF-8 γράφεται μέσω σύνδεσης latin1 σε στήλη latin1. Τα γράμματα που δεν υπάρχουν στο latin1 γίνονται ? και χάνονται οριστικά. Όσα περνούν σώνονται, αλλά το phpMyAdmin και η εξαγωγή δείχνουν αβ.

Μια γραμμή από εξαγωγή CSV του 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

  1. Εξαγάγετε τον πίνακα από το phpMyAdmin ως SQL ή CSV – ή με mysqldump --default-character-set=utf8mb4.
  2. Ρίξτε το αρχείο στο πλαίσιο παραπάνω. Το Mojibuster επισκευάζει μόνο τα χαλασμένα σημεία· οι σωστοί χαρακτήρες μένουν ως έχουν.
  3. Ελέγξτε τα επισκευασμένα σημεία στο Τι άλλαξε; και κατεβάστε το αρχείο.
  4. Εισαγάγετέ το σε πίνακα utf8mb4 και επιλέξτε utf-8 ως σύνολο χαρακτήρων στο παράθυρο εισαγωγής.
  5. Δοκιμάστε πρώτα σε αντίγραφο, πριν αντικαταστήσετε τον πραγματικό πίνακα.

Η εξαγωγή δεν φεύγει ποτέ από τον υπολογιστή σας – κάτι σημαντικό για δεδομένα πελατών. Αν έχετε εξαγάγει 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 ανά αρχείο. Τις μεγαλύτερες βάσεις εξαγάγετέ τες πίνακα πίνακα.

Περισσότεροι οδηγοί