Simply.com is available in english

Charset και collation σε μια MySQL-database

Χρησιμοποιήστε 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.

Μέθοδος 1: phpMyAdmin

Αλλαγή προεπιλογής για ολόκληρη τη βάση δεδομένων (ισχύει μόνο για νέους πίνακες):

  1. Συνδεθείτε στο phpMyAdmin και επιλέξτε τη βάση δεδομένων στην αριστερή πλευρά.
  2. Κάντε κλικ στην καρτέλα Λειτουργίες.
  3. Βρείτε την ενότητα Ταξινόμηση (Collation).
  4. Επιλέξτε utf8mb4_unicode_ci από το αναπτυσσόμενο μενού.
  5. Κάντε κλικ Εκτέλεση.

Αλλαγή υπάρχοντος πίνακα (συμπεριλαμβανομένων όλων των στηλών του):

  1. Επιλέξτε τον πίνακα στην αριστερή πλευρά.
  2. Κάντε κλικ στην καρτέλα Λειτουργίες.
  3. Στην ενότητα Επιλογές Πίνακα επιλέξτε νέα ταξινόμηση.
  4. Σημειώστε το Αλλαγή επίσης ταξινόμησης για όλες τις στήλες.
  5. Κάντε κλικ Εκτέλεση.

Μέθοδος 2: SQL

Αλλαγή προεπιλογής της βάσης δεδομένων:

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 της σύνδεσης (SET NAMES)

Το 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

Άλλα σχετικά άρθρα