Eine der Antworten auf eine Frage, die ich gestern gestellt habe, schlug vor, dass ich sicherstellen sollte, dass meine Datenbank UTF-8-Zeichen korrekt verarbeiten kann. Wie kann ich das mit MySQL machen?
101
Eine der Antworten auf eine Frage, die ich gestern gestellt habe, schlug vor, dass ich sicherstellen sollte, dass meine Datenbank UTF-8-Zeichen korrekt verarbeiten kann. Wie kann ich das mit MySQL machen?
CHARACTER SETs
; 5.1.24 mit der Zusammenstellung deutscher Scharfschützen (ß) durcheinander gebracht, die durch Hinzufügen einer weiteren Zusammenstellung in 5.1.62 korrigiert wurde (was die Sache wohl noch schlimmer macht); 5.5.3 füllte utf8 mit dem neuen Zeichensatz utf8mb4 aus.utf8
. Es werden nur bis zu 3-Byte-Zeichen unterstützt. Der richtige Zeichensatz, den Sie in MySQL verwenden sollten, istutf8mb4
.Antworten:
Aktualisieren:
Kurze Antwort - Sie sollten fast immer den
utf8mb4
Zeichensatz und dieutf8mb4_unicode_ci
Sortierung verwenden.So ändern Sie die Datenbank:
Sehen:
Aarons Kommentar zu dieser Antwort Wie man MySQL dazu bringt, UTF-8 richtig zu handhaben
Was ist der Unterschied zwischen utf8_general_ci und utf8_unicode_ci?
Konvertierungshandbuch: https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-conversion.html
Ursprüngliche Antwort:
MySQL 4.1 und höher hat einen Standardzeichensatz von UTF-8. Sie können dies in Ihrer
my.cnf
Datei überprüfen. Denken Sie daran, sowohl Client als auch Server (default-character-set
undcharacter-set-server
) festzulegen .Wenn Sie bereits Daten haben, die Sie in UTF-8 konvertieren möchten, sichern Sie Ihre Datenbank und importieren Sie sie als UTF-8 zurück. Stellen Sie dabei Folgendes sicher:
SET NAMES utf8
Sie diese Option, bevor Sie sie abfragen / in die Datenbank einfügenDEFAULT CHARSET=utf8
Option, wenn Sie neue Tabellen erstellenmy.cnf
). Denken Sie daran, dass alle von Ihnen verwendeten Sprachen (z. B. PHP) ebenfalls UTF-8 sein müssen. Einige Versionen von PHP verwenden ihre eigene MySQL-Client-Bibliothek, die möglicherweise nicht UTF-8-fähig ist.Wenn Sie vorhandene Daten migrieren möchten, denken Sie daran, zuerst zu sichern! Viele seltsame Datenverluste können auftreten, wenn die Dinge nicht wie geplant verlaufen!
Einige Ressourcen:
quelle
utf8
bezieht sich MySQL in MySQL nur auf eine kleine Teilmenge des vollständigen Unicode. Sie solltenutf8mb4
stattdessen verwenden, um die volle Unterstützung zu erzwingen. Siehe mathiasbynens.be/notes/mysql-utf8mb4 "Lange Zeit habe ich den utf8-Zeichensatz von MySQL für Datenbanken, Tabellen und Spalten verwendet, vorausgesetzt, er ist der oben beschriebenen UTF-8-Codierung zugeordnet."latin1
undlatin1_swedish_ci
für den Standardzeichensatz und die Standardkollatierung. Eine Bestätigung finden Sie auf der Seite "Server-Zeichensatz und Sortierung" im MySQL-Handbuch: dev.mysql.com/doc/refman/5.1/en/charset-server.htmlutf8mb4
, wenn der meiste Text ASCII ist. Obwohlchar
Zeichenfolgen vorbelegt sind, sindvarchar
Zeichenfolgen nicht zugeordnet - siehe die letzten Zeilen auf dieser Dokumentationsseite . Beispielsweisechar(10)
werden unter utf8mb4 pessimistisch 40 Bytes reserviert, esvarchar(10)
werden jedoch Bytes entsprechend der Codierung mit variabler Länge zugewiesen.varchar(n)
auf dentext
Datentyp aktualisiert , wenn Sie versuchen, einvarchar(n)
Feld so zu ändern , dass es größer als die zulässige Bytegröße ist (während Sie eine Warnung ausgeben). Ein Index hat auch eine untere Obergrenze im ungünstigsten Fall, was andere Probleme aufwerfen kann.Um dies "dauerhaft" zu machen, in
my.cnf
:Um dies zu überprüfen, gehen Sie zum Client und zeigen Sie einige Variablen an:
Stellen Sie sicher , dass sie alle sind
utf8
, außer..._filesystem
, was sein solltebinary
und..._dir
was irgendwo in der MySQL-Installation zeigt.quelle
create table my_name(field_name varchar(25) character set utf8);
utf8
ist nicht "voll" UTF-8.MySQL 4.1 und höher verfügt über einen Standardzeichensatz, den es aufruft
utf8
, der jedoch nur eine Teilmenge von UTF-8 ist (erlaubt nur Drei-Byte-Zeichen und weniger).Verwenden Sie
utf8mb4
als Zeichensatz, wenn Sie "volles" UTF-8 möchten.quelle
utf8
enthält keine Zeichen wie Emoticons.utf8mb4
tut. Überprüfen Sie dies für weitere Informationen zum Aktualisieren: mathiasbynens.be/notes/mysql-utf8mb4Die kurze Antwort: An
utf8mb4
4 Stellen verwenden:SET NAMES utf8mb4
oder etwas Äquivalentes, wenn die Verbindung des Clients zu MySQL hergestellt wirdCHARACTER SET utf8mb4
auf allen Tabellen / Spalten - mit Ausnahme von Spalten, die ausschließlich ascii / hex / country_code / zip_code / etc.<meta charset charset=UTF-8>
wenn Sie in HTML ausgeben. (Ja, die Schreibweise ist hier anders.)Weitere Infos ;
UTF8 den ganzen Weg
Die obigen Links enthalten die "detaillierte kanonische Antwort ist erforderlich, um alle Bedenken auszuräumen". - In diesem Forum ist der Platz begrenzt.
Bearbeiten
Neben
CHARACTER SET utf8mb4
"allen" Charakteren der WeltCOLLATION utf8mb4_unicode_520_ci
ist wohl die "beste Allround" -Kollation zu verwenden. (Es gibt auch türkische, spanische usw. Kollatierungen für diejenigen, die die Nuancen in diesen Sprachen wollen.)quelle
Der Zeichensatz ist eine Eigenschaft der Datenbank (Standard) und der Tabelle. Sie können einen Blick darauf werfen (MySQL-Befehle):
Mit anderen Worten; Es ist ganz einfach, Ihren Datenbankzeichensatz zu überprüfen oder zu ändern:
quelle
utf8
ist nicht "voll" UTF-8.Geben Sie den folgenden Befehl an der Eingabeaufforderung mysql> ein, um die Zeichensatzcodierung für die Datenbank selbst in UTF-8 zu ändern. USE
ALTER DATABASE
.. Ersetzen Sie DBNAME durch den Datenbanknamen:Dies ist ein Duplikat dieser Frage. Wie konvertiere ich einen gesamten MySQL-Datenbankzeichensatz und eine Sortierung in UTF-8?
quelle
Ich folgte Javiers Lösung, fügte aber in my.cnf einige andere Zeilen hinzu:
Ich habe diese Idee hier gefunden: http://dev.mysql.com/doc/refman/5.0/en/charset-server.html im ersten / einzigen Benutzerkommentar am Ende der Seite. Er erwähnt, dass das Überspringen des Zeichensatz-Client-Handshakes eine gewisse Bedeutung hat.
quelle
skip-character-set-client-handshake
war der Schlüssel.Diese Tipps zu MySQL und UTF-8 können hilfreich sein. Leider stellen sie keine vollständige Lösung dar, sondern nur gängige Fallstricke.
quelle
Stellen Sie ein
database collation
, dass esUTF-8
danntable collation
auf den Datenbankstandard angewendet wird.quelle
Ihre Antwort ist, dass Sie über MySQL-Einstellungen konfigurieren können. In Meine Antwort ist möglicherweise etwas aus dem Zusammenhang geraten, aber dies ist auch eine Hilfe für Sie.
wie man konfiguriert
Character Set
undCollation
.utf8
, während für Anwendungen, die eine andere Datenbank verwenden, möglicherweise sjis erforderlich sind.In den hier gezeigten Beispielen für Ihre Frage zum Festlegen des utf8-Zeichensatzes wird hier auch die Kollatierung für hilfreichere (
utf8_general_ci
Kollatierung`) festgelegt.Geben Sie die Zeicheneinstellungen pro Datenbank an
Geben Sie die Zeicheneinstellungen beim Serverstart an
Geben Sie die Zeicheneinstellungen zur MySQL-Konfigurationszeit an
Verwenden Sie die folgenden Anweisungen, um die Werte der Zeichensatz- und Sortiersystemvariablen anzuzeigen, die für Ihre Verbindung gelten:
Dies mag eine lange Antwort sein, aber es gibt alle Möglichkeiten, die Sie verwenden können. Hoffentlich ist meine Antwort hilfreich für Sie. Weitere Informationen finden Sie unter http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
quelle
SET NAMES UTF8
Das ist der Trick
quelle
SET NAMES UTF8
(oderUTF8mb4
) korrekt ist, erklären Sie nicht, was es tut (Zeichensatz, der für diese Verbindung verwendet wird). "Dies macht den Trick" klingt so, als würde es das Problem lösen (MySQL sollte UTF-8 richtig handhaben), aber viele MySQL-Datenbanken sind standardmäßig auf latin1 eingestellt, sodass dies keine richtige Lösung wäre. Ich würde den Standardzeichensatz und die Tabellenzeichensätze in utf8mb4 ändern. Wirklich, diese Antwort ist ziemlich unvollständig, also habe ich sie abgelehnt.DATENBANKVERBINDUNG ZU UTF-8
quelle
Stellen Sie Ihre Datenbankverbindung auf UTF8 ein:
quelle
mysql_*
Schnittstelle. Wechseln Sie zumysqli_*
oderPDO
.Konnte eine Lösung finden. Führen Sie die folgenden Schritte aus, wie unter http://technoguider.com/2015/05/utf8-set-up-in-mysql/ angegeben.
quelle
CHARACTER SET utf8
.root
wird nicht das alles wichtige ausführeninit_connect
.