1. Εισαγωγή
Η MySQL πρόσθεσε αυτήν την κωδικοποίηση utf8mb4 μετά την 5.5.3, που σημαίνει τα περισσότερα byte 4, και χρησιμοποιείται ειδικά για να είναι συμβατή με unicode τεσσάρων byte. Ευτυχώς, το utf8mb4 είναι ένα υπερσύνολο του utf8 και δεν απαιτείται άλλη μετατροπή εκτός από την αλλαγή της κωδικοποίησης σε utf8mb4. Φυσικά, για να εξοικονομήσετε χώρο, αρκεί γενικά να χρησιμοποιήσετε το utf8.
2. Περιγραφή περιεχομένου
Όπως αναφέρθηκε παραπάνω, αφού το utf8 μπορεί να αποθηκεύσει τους περισσότερους κινεζικούς χαρακτήρες, γιατί να χρησιμοποιήσετε το utf8mb4; Το μέγιστο μήκος χαρακτήρων της κωδικοποίησης UTF8 που υποστηρίζεται από τη MySQL είναι 3 byte και αν συναντήσετε έναν ευρύ χαρακτήρα 4 byte, θα εισαγάγετε μια εξαίρεση. Ο μέγιστος χαρακτήρας Unicode που κωδικοποιείται από UTF-8 των τριών byte είναι 0xffff, το οποίο είναι το βασικό πολύγλωσσο επίπεδο (BMP) στο Unicode. Δηλαδή, οποιοσδήποτε χαρακτήρας Unicode που δεν βρίσκεται στο βασικό επίπεδο πολλαπλών κειμένων δεν μπορεί να αποθηκευτεί χρησιμοποιώντας το σύνολο χαρακτήρων utf8 της Mysql. Αυτά περιλαμβάνουν emoji (το Emoji είναι μια ειδική κωδικοποίηση Unicode που βρίσκεται συνήθως σε τηλέφωνα iOS και Android) και πολλούς κινεζικούς χαρακτήρες που χρησιμοποιούνται ασυνήθιστα, καθώς και τυχόν νέους χαρακτήρες Unicode και πολλά άλλα.
3. Η βασική αιτία του προβλήματος
Η αρχική μορφή UTF-8 χρησιμοποιούσε ένα έως έξι byte και μπορούσε να κωδικοποιήσει έως και 31 χαρακτήρες. Η τελευταία προδιαγραφή UTF-8 χρησιμοποιεί μόνο ένα έως τέσσερα byte και μπορεί να κωδικοποιήσει έως και 21 bit, που είναι ακριβώς αυτό που αντιπροσωπεύει και τα 17 επίπεδα Unicode. Το utf8 είναι ένα σύνολο χαρακτήρων στη Mysql που υποστηρίζει μόνο χαρακτήρες UTF-8 μήκους έως τριών byte, που είναι το βασικό επίπεδο πολλαπλών κειμένων στο Unicode.
Γιατί το UTF8 στη Mysql υποστηρίζει μόνο χαρακτήρες UTF-8 με μέγιστο αριθμό τριών byte; Το σκέφτηκα, ίσως επειδή όταν αναπτύχθηκε για πρώτη φορά η Mysql, το Unicode δεν είχε βοηθητικό επίπεδο. Εκείνη την εποχή, η Επιτροπή Unicode εξακολουθούσε να ονειρεύεται «65.535 χαρακτήρες είναι αρκετοί για όλο τον κόσμο». Τα μήκη συμβολοσειρών στη Mysql μετρούν χαρακτήρες αντί για byte και για τύπους δεδομένων CHAR, οι συμβολοσειρές πρέπει να είναι αρκετά μεγάλες. Όταν χρησιμοποιείτε το σύνολο χαρακτήρων utf8, το μήκος που πρέπει να διατηρηθεί είναι το μεγαλύτερο μήκος χαρακτήρων utf8 πολλαπλασιασμένο με το μήκος συμβολοσειράς, επομένως είναι φυσικό να περιορίσετε το μέγιστο μήκος utf8 σε 3, για παράδειγμα, η CHAR(100) Mysql θα διατηρήσει 300 byte. Όσο για το γιατί οι επόμενες εκδόσεις δεν υποστηρίζουν χαρακτήρες UTF-4 8 byte, νομίζω ότι το ένα είναι για λόγους συμβατότητας προς τα πίσω και το άλλο είναι ότι σπάνια χρησιμοποιούνται χαρακτήρες εκτός του βασικού πολύγλωσσου επιπέδου.
Για να αποθηκεύσετε χαρακτήρες UTF-4 8 byte στη Mysql, απαιτείται το σύνολο χαρακτήρων utf8mb4, αλλά υποστηρίζεται μόνο μετά την έκδοση 5.5.3 (δείτε την έκδοση: select version(); )。 Νομίζω ότι για καλύτερη συμβατότητα, θα πρέπει πάντα να χρησιμοποιείτε utf8mb4 αντί για utf8. Για δεδομένα τύπου CHAR, το utf8mb4 καταναλώνει περισσότερο χώρο και σύμφωνα με την επίσημη σύσταση της Mysql, χρησιμοποιήστε VARCHAR αντί για CHAR.
|