Χρησιμοποιήστε charset utf8mb4 και collation utf8mb4_unicode_ci στο MySQL και αλλάξτε τα μέσω phpMyAdmin ή εντολών ALTER, θυμηθείτε επίσης το SET NAMES για τη σύνδεση.
Charset (σύνολο χαρακτήρων) καθορίζει ποιοι χαρακτήρες μπορεί να αποθηκεύσει η βάση δεδομένων, ενώ η collation καθορίζει πώς συγκρίνονται και ταξινομούνται οι χαρακτήρες. Λάθος charset είναι η πιο συχνή αιτία τα δανικά γράμματα (æ, ø, å) ή τα emoji να εμφανίζονται ως ερωτηματικά ή mojibake (π.χ. æ αντί για æ).
Χρησιμοποιήστε utf8mb4 ως charset και utf8mb4_unicode_ci ως collation. Το utf8mb4 υποστηρίζει όλους τους χαρακτήρες Unicode, συμπεριλαμβανομένων των emoji.
Αλλαγή προεπιλογής για ολόκληρη τη βάση δεδομένων (ισχύει μόνο για νέους πίνακες):
utf8mb4_unicode_ci από το αναπτυσσόμενο μενού.Αλλαγή υπάρχοντος πίνακα (συμπεριλαμβανομένων όλων των στηλών του):
Αλλαγή προεπιλογής της βάσης δεδομένων:
ALTER DATABASE mindatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Αλλαγή πίνακα και όλων των στηλών του:
ALTER TABLE mintabel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Στο phpMyAdmin μπορείτε να αλλάξετε το charset ανά στήλη: επιλέξτε τον πίνακα, κάντε κλικ Δομή, κάντε κλικ Αλλαγή δίπλα στη στήλη, και επιλέξτε νέα ταξινόμηση στην περιγραφή της στήλης.
Δημιουργήστε αυτόματα τις εντολές ALTER:
SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mindatabase' AND TABLE_TYPE = 'BASE TABLE';
Εκτελέστε το αποτέλεσμα στο phpMyAdmin στην καρτέλα SQL ή μέσω της γραμμής εντολών.
Το charset της βάσης δεδομένων και το charset της σύνδεσης είναι δύο διαφορετικά πράγματα. Ακόμη και αν οι πίνακές σας είναι σωστά ρυθμισμένοι σε utf8mb4, οι χαρακτήρες μπορεί να καταστραφούν κατά τη μεταφορά, εάν η σύνδεση μεταξύ της εφαρμογής και του MySQL χρησιμοποιεί διαφορετικό charset.
SET NAMES utf8mb4 ορίζει τρεις μεταβλητές συνεδρίας ταυτόχρονα:
character_set_client — τι αναμένει ο διακομιστής να λάβει από τον πελάτηcharacter_set_connection — τι χρησιμοποιεί ο διακομιστής εσωτερικά κατά την επεξεργασία ερωτημάτωνcharacter_set_results — τι στέλνει ο διακομιστής πίσω στον πελάτηSET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
Καλύτερη πρακτική: χρησιμοποιήστε την ενσωματωμένη επιλογή charset του οδηγού αντί να στέλνετε SET NAMES χειροκίνητα. Αυτό διασφαλίζει ότι ακόμη και λειτουργίες όπως mysqli_real_escape_string() και PDO::quote() χρησιμοποιούν το σωστό charset — διαφορετικά, σε σπάνιες περιπτώσεις, μπορεί να ανοίξετε την πόρτα σε SQL‑injection.
Άρθρο από την κατηγορία υποστήριξης: MySQL