Wenn UPDATA- und INSERT-Daten in MySLQ verwendet werden und die Daten Emoji-Symbole enthalten, wie zum Beispiel: ?, ?, ?, ist es leicht, sie zu aktualisieren oder erfolglos einzufügen, was zu einem Fehler führt.
Error: ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value: '\xF0\x9F\x91\xBD\xF0\x9F...' for column 'name' at row
Ich bin fast zusammengebrochen, aber zum Glück habe ich dieses seltsame Problem endlich gelöst. Der in den Daten gezeigte Grund ist, dass die UTF8-Codierung vor MYSQL 5.5 nur 1-3 Bytes und nur den Unicode-Codierungsbereich des BMP-Teils unterstützte und Emoji-Symbole zufällig in 4-Byte-Codierung gespeichert wurden. Ab MYSQL5.5 kann die 4-Byte-UTF-Kodierung utf8mb4 unterstützt werden. Ein Zeichen kann bis zu 4 Bytes haben, sodass mehr Zeichensätze unterstützt werden können. Um das Problem zu lösen, müssen daher alle Zeichenkodierungen der Datenbanktabelle in utf8mb4 geändert werden.
Empfohlen: MySQL-Video-Tutorial
Gemeinsame Zeichensätze
ASCII: American Standard Encoding for Information Interchange; Westeuropäische Sprachen; Einzelbyte-Kodierung, 7 Bits repräsentieren ein Zeichen, insgesamt 128 Zeichen.
GBK: Interne Codeerweiterungsspezifikation für chinesische, japanische und koreanische Zeichen; insgesamt sind 21.003 chinesische Zeichen enthalten, eine Erweiterung von GB2312.
UTF-8: Unicode-Standard für Zeichenkodierung mit variabler Länge; Unicode-Standard (Unicode), ein einheitlicher Standard in der Branche, einschließlich Dutzender Textsysteme auf der Welt; Verwenden Sie ein bis drei Bytes, um jedes Zeichen zu kodieren.
utf8mb4: speichert vier Bytes. Das Anwendungsszenario wird zum Speichern von Emoji-Ausdrücken verwendet, da Emoji-Ausdrücke vier Bytes lang sein können.
utf8mb4: MySQL-Version > 5.5.3.
Weitere gängige Zeichensätze: UTF-32, UTF-16, Big5, latin1
Der Zeichensatz in der Datenbank enthält zwei Bedeutungsebenen
Eine Sammlung verschiedener Texte und Symbole, einschließlich der Zeichen, Satzzeichen, grafischen Symbole, Zahlen usw. jedes Landes.
Die Kodierungsmethode von Zeichen, dh die Zuordnungsregeln zwischen Binärdaten und Zeichen.
SystemumgebungMySQL 5.7.14
Mac OSX 10.11.6
Zuerst sichernSichern Sie alle Daten auf Ihrem Server, bevor Sie Daten aktualisieren. Behalten Sie gute Gewohnheiten bei, Sicherheit geht vor!
Aktualisieren Sie Ihr MySQLDie neue Datenbank kann hier heruntergeladen werden
Aktualisieren Sie den MySQL-Server auf v5.5.3+. Ändern Sie Ihre Datenbank, Tabellen, Felder
# 对每一个数据库: ALTER DATABASE 这里数据库名字 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; # 对每一个表: ALTER TABLE 这里是表名字 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # 对每一个字段: ALTER TABLE 这里是表名字 CHANGE 字段名字 重复字段名字 VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # 上面一句或者使用modify来更改 ALTER TABLE 这里是表名字 modify 字段名字 VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '';
utf8mb4 ist vollständig abwärtskompatibel mit utf8, ohne verstümmelte Zeichen oder andere Formen von Datenverlust. Theoretisch können Sie es problemlos ändern. Wenn Sie sich nicht sicher sind, ob Sie es ändern möchten, können Sie die Daten aus der Sicherung wiederherstellen und dann den Programmierer mit dem Emoji-kompatiblen Speicherproblem befassen. Beim Speichern können Sie sie filtern und in base64 konvertieren , und es dann beim Abrufen wieder konvertieren? ... Es ist bequemer, die Datenbank zu ändern.
Überprüfen Sie Ihre Felder und IndizesStellen Sie nicht alles auf utf8mb4, das ist notwendig. Ich setze es nur auf utf8mb4, wenn einige meiner Feldtypen VARCHAR sind.
Ändern Sie die MySQL-KonfigurationsdateiDieser Ort ist am verwirrendsten. Ich kann /etc/my.cnf auf meinem Mac OSX-System nicht finden. Es existiert überhaupt nicht, also müssen wir eine solche Datei erstellen und ändern.
# 进入这个目录, # 在这个目录下面有个后缀为`.cnf`的文件 cd /usr/local/mysql/support-files/ # 将这个文件复制到`etc`目录中并将名字命名为`my.cnf` sudo cp my-default.cnf /etc/my.cnf # 然后编辑`my.cnf`文件,将下面内容复制到里面。 sudo vim /etc/my.cnfMySQL-Konfigurationsdatei (/etc/my.cnf):
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
Der Neustartschritt ist sehr wichtig, sonst hat er keine Wirkung.
Start: /usr/local/mysql/support-files/mysql.server start
Stopp: /usr/local/mysql/support-files/mysql.server stop
Neustart:/usr/local/mysql/support-files/mysql.server restart
Das System kann in dieser Form neu starten, stoppen oder starten
service mysqld stop service mysqld start service mysqld restartÜberprüfen Sie, ob dies der Fall ist set Success
Überprüfen Sie mit dem folgenden Befehl, ob die Einstellung erfolgreich war!
# 登陆MySQL进行查询 mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; # 运行上面代码显示下面结果 # +--------------------------+--------------------+ # | Variable_name | Value | # +--------------------------+--------------------+ # | character_set_client | utf8mb4 | # | character_set_connection | utf8mb4 | # | character_set_database | utf8mb4 | # | character_set_filesystem | binary | # | character_set_results | utf8mb4 | # | character_set_server | utf8mb4 | # | character_set_system | utf8 | # | collation_connection | utf8mb4_unicode_ci | # | collation_database | utf8mb4_unicode_ci | # | collation_server | utf8mb4_unicode_ci | # +--------------------------+--------------------+ # 查看表的情况 mysql> SHOW FULL COLUMNS FROM users_profile;
An diesem Punkt bedeutet das, dass Sie Erfolg hatten! Glückwunsch! ~
Reparieren und optimieren Sie den TischIch bin an diesem Punkt angelangt und es besteht keine Notwendigkeit, den Tisch zu reparieren und zu optimieren Ich habe diese beiden Befehle ausgeführt, obwohl ich nicht weiß, wozu sie dienen, aber ich belasse sie hier als Notiz.
REPAIR TABLE 表名字; OPTIMIZE TABLE 表名字;
Das obige ist der detaillierte Inhalt vonMySQL unterstützt die Speicherung von Emoji-Symbolen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!