Derzeit verwenden wir die folgenden Befehle in PHP, um den Zeichensatz in unserer Anwendung auf UTF-8 zu setzen .
Da dies ein wenig Overhead ist, möchten wir dies als Standardeinstellung in MySQL festlegen. Können wir dies in /etc/my.cnf oder an einem anderen Ort tun?
SET NAMES 'utf8'
SET CHARACTER SET utf8
Ich habe in /etc/my.cnf nach einem Standardzeichensatz gesucht, aber an Zeichensätzen ist nichts.
Zu diesem Zeitpunkt habe ich Folgendes getan, um den MySQL-Zeichensatz und die Kollatierungsvariablen auf UTF-8 zu setzen:
skip-character-set-client-handshake
character_set_client=utf8
character_set_server=utf8
Ist das ein richtiger Weg, um damit umzugehen?
mysql
character-encoding
Jorre
quelle
quelle
utf8mb4
, dh echtes UTF-8 mit vollständiger Unicode-Unterstützung. Siehe So unterstützen Sie vollständigen Unicode in MySQL-Datenbanken .utf8mb4
dies ein gefährlicher Präzedenzfall ist?Antworten:
Um die Standardeinstellung auf UTF-8 festzulegen, möchten Sie my.cnf Folgendes hinzufügen
Wenn Sie den Zeichensatz für eine vorhandene Datenbank ändern möchten, lassen Sie es mich wissen ... Ihre Frage hat ihn nicht direkt angegeben, daher bin ich mir nicht sicher, ob Sie dies tun möchten.
quelle
Table
CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;[mysqld]
.utf8
Zeichensatz von MySQL nicht verwenden sollten, wenn Sie UTF-8 verwenden möchten . Verwenden Sieutf8mb4
stattdessen.Für die aktuelle Version von MySQL gilt:
verursacht ein Problem. Es ist veraltet, denke ich.
Wie Justin Ball in " Upgrade auf MySQL 5.5.12 " sagt und jetzt MySQL nicht mehr startet , sollten Sie:
Entfernen Sie diese Anweisung und Sie sollten gut sein.
Dann sollte Ihre Konfigurationsdatei (z. B. '/etc/my.cnf') folgendermaßen aussehen:
Starten Sie MySQL neu.
Führen Sie die folgenden Abfragen in Ihrer MySQL-Eingabeaufforderung aus, um sicherzustellen, dass MySQL UTF-8 ist:
Erste Abfrage:
Die Ausgabe sollte folgendermaßen aussehen:
Zweite Abfrage:
Und die Abfrageausgabe lautet:
quelle
character_set_filesystem | utf8
. Ich bin mir nicht sicher, ist es in Ordnung?mysql Ver 15.1 Distrib 5.5.35-MariaDB, for debian-linux-gnu (x86_64) using readline 5.1
default-character-set
, sondern können zuloose-default-character-set = utf8
"lose" wechseln. Dasmysqlbinlog
freut mich, wenn Sie es brauchen - google für: "lose Standard-Zeichensatz" mysqlbinlog .init-connect='SET NAMES utf8'
wirklich nötig? Wenn nicht, können wir definitiv auf die Leistung verzichten.Diese Frage hat bereits viele Antworten, aber Mathias Bynens erwähnte, dass 'utf8mb4' anstelle von 'utf8' verwendet werden sollte, um eine bessere UTF-8-Unterstützung zu erhalten ('utf8' unterstützt keine 4-Byte-Zeichen, Felder werden beim Einfügen abgeschnitten ). Ich halte dies für einen wichtigen Unterschied. Hier ist eine weitere Antwort zum Festlegen des Standardzeichensatzes und der Sortierung. Eine, mit der Sie einen Haufen Kot (💩) einlegen können.
Dies funktioniert unter MySQL 5.5.35.
Beachten Sie, dass einige der Einstellungen optional sein können. Da ich nicht ganz sicher bin, ob ich etwas vergessen habe, werde ich diese Antwort zu einem Community-Wiki machen.
Alte Einstellungen
Konfig
Neue Einstellungen
character_set_system ist immer utf8 .
Dies wirkt sich nicht auf vorhandene Tabellen aus, sondern ist nur die Standardeinstellung (wird für neue Tabellen verwendet). Der folgende ALTER-Code kann zum Konvertieren einer vorhandenen Tabelle verwendet werden (ohne die Problemumgehung für die Dump-Wiederherstellung):
Bearbeiten:
Auf einem MySQL 5.0-Server bleiben Character_set_client, Character_set_connection, Character_set_results und Collation_connection bei latin1. Durch Ausgabe
SET NAMES utf8
(utf8mb4 in dieser Version nicht verfügbar) werden diese ebenfalls auf utf8 gesetzt.Vorsichtsmaßnahme : Wenn Sie eine utf8-Tabelle mit einer Indexspalte vom Typ VARCHAR (255) hatten, kann diese in einigen Fällen nicht konvertiert werden, da die maximale Schlüssellänge überschritten wird (
Specified key was too long; max key length is 767 bytes.
). Reduzieren Sie nach Möglichkeit die Spaltengröße von 255 auf 191 (da 191 * 4 = 764 <767 <192 * 4 = 768). Danach kann die Tabelle konvertiert werden.quelle
character_set_database
ist immer nochutf8
undcollation_database
ist utf8_bin`. Habe ich etwas verpasst?character-set-client-handshake = FALSE
Zum Abschnitt [mysqld] hinzufügen , damit immer die Standardcodierung verwendet wird, auch wenn Sie auf der Anwendungsebene einen Fehler machenUnter MySQL 5.5 habe ich in my.cnf
Ergebnis ist
quelle
skip-character-set-client-handshake
genau und unter welchen Umständen ist es erforderlich?show variables like "%collation%";
sah ich 'collation_connection' alsutf8_general_ci
und collation_database und collation_server alsutf8_unicode_ci
. Durch Hinzufügen der Zeile wurdeskip-character-set-client-handshake
der allgemeine Eintrag in Unicode geändert, sodass alle drei konsistent waren.skip-character-set-client-handshake
hat es für mich getan (zusammen mit dem "Zeichensatz-Server" und dem "Kollatierungs-Server" natürlich - auf Debian 7). Dasinit_connect
s machte mit oder ohne das keinen Unterschiedskip
und schien überflüssig. +1 und danke.Hinweis: Die Datei my.cnf befindet sich unter
/etc/mysql/
Nach dem Hinzufügen dieser Zeilen:
Vergessen Sie nicht, den Server neu zu starten:
quelle
NijaCat war nah dran, aber Overkill angegeben:
Um die Standardeinstellung auf UTF-8 festzulegen, möchten Sie my.cnf Folgendes hinzufügen
Dann, um zu überprüfen:
quelle
[mysql] default-character-set=utf8
dann?[mysqld]
Verwendungcharacter-set-server
anstelle vondefault-character-set
Ich habe auch herausgefunden, dass MySQL 5.5.x nach dem Einstellen
default-character-set = utf8
unter[mysqld]
Titel nicht unter Ubuntu 12.04 (Precise Pangolin) gestartet werden würde .quelle
[mysqld]
sollten Siecharacter-set-server
anstelle von verwendendefault-character-set
. (Sehr verwirrend, ich stimme zu!)MySQL v5.5.3 und höher:
Fügen Sie einfach drei Zeilen nur im Abschnitt [mysqld] hinzu:
Hinweis:
skip-character-set-client-handshake
Wenn Sie hier einschließen, müssen Sie nicht mehrinit-connect
in[mysqld]
unddefault-character-set
in die Abschnitte[client]
und einschließen[mysql]
.quelle
Unter Xubuntu 12.04 habe ich einfach hinzugefügt
zu /etc/mysql/my.cnf
Und das Ergebnis ist
Schauen Sie sich auch http://dev.mysql.com/doc/refman/5.6/en/charset-server.html an
quelle
Alle hier aufgeführten Einstellungen sind korrekt, aber hier ist die optimalste und ausreichendste Lösung:
Fügen Sie diese hinzu
/etc/mysql/my.cnf
.Bitte beachten Sie, dass ich aufgrund des Leistungsproblems den Kollatierungstyp utf8_unicode_ci wähle .
Das Ergebnis ist:
Und dies ist, wenn Sie sich als Nicht-SUPER-Benutzer verbinden !
Zum Beispiel der Unterschied zwischen der Verbindung als SUPER- und Nicht-SUPER-Benutzer (natürlich im Fall der Kollatierung utf8_unicode_ci ):
Benutzer mit SUPER priv.:
Benutzer mit Nicht-SUPER- Privilegien:
Ich habe einen umfassenden Artikel (rus) geschrieben, in dem ausführlich erklärt wird, warum Sie die eine oder andere Option verwenden sollten. Alle Arten von Zeichensätzen und Kollatierungen werden berücksichtigt: für Server, für Datenbank, für Verbindung, für Tabelle und sogar für Spalte.
Ich hoffe, dass dies und der Artikel dazu beitragen werden, unklare Momente zu klären.
quelle
utf8_unicode_ci
aufgrund von Leistungsproblemen verwenden. Warum also nichtutf8_bin
stattdessen verwenden?utf8_unicode_ci
. Ich habe nie Zeit damit verbracht, die Leistung zu testen.Die Richtlinie wurde geändert in
character-set-system=utf8
http://dev.mysql.com/doc/refman/5.6/en/charset-configuration.html
quelle
MySQL-Versionen und Linux-Distributionen können bei der Konfiguration von Bedeutung sein.
Die Änderungen unter
[mysqld]
Abschnitt werden jedoch empfohlen.Ich möchte die Antwort von Tomazzlender kurz erläutern:
[mysqld]
Dadurch wird collation_connection in utf8_unicode_ci geändert
Verwenden von
SET NAMES
:Die SET NAMES beeinflussen drei Zeichen, dh:
Dies wird eingestellt
character_set_database & character_set_server
Dies wirkt sich nur auf collation_database & collation_server aus
Entschuldigung, ich bin mir nicht so sicher, wofür das ist. Ich benutze es jedoch nicht:
quelle
character_set_server
die nicht manuell eingestellt werden sollten.character set
beim Aufbau einer Datenbankverbindung explizit übergeben , sehen aber etwas nervig aus.character_set_server
im[mysqld]
Abschnitt aufcharacter_set_database
und auswirkencharacter_set_server
. Ich denke, es empfiehlt sich, explizit darauf hinzuweisencharacter set
, was Sie beim Erstellen einer Datenbank, einer Tabelle und einer Datenbankverbindung verwenden möchten. Ehrlich gesagt ist die Dokumentation vonmysql
nicht so leicht zu verstehen. Wissen Sie , ob es eine generische Art und Weise ist es, alle zu erhaltencharacter set
undcollation
in mysql Einstellungen gemacht?Auf Fedora 21
Hinzufügen folgen:
Speichern und schließen.
Letzte Erinnerung Neustart Service mysqld mit
service mysqld restart
.quelle
MySQL 5.5, alles was Sie brauchen ist:
collation_server
es ist optional.quelle
Wenn Sie Probleme haben, die Zeichensatzunterstützung des Clients mithilfe von MySQL Workbench zu bestätigen, beachten Sie den folgenden Hinweis:
Wichtig Alle von MySQL Workbench geöffneten Verbindungen setzen den Client-Zeichensatz automatisch auf utf8. Das manuelle Ändern des Client-Zeichensatzes, z. B. die Verwendung von SET NAMES ..., kann dazu führen, dass MySQL Workbench die Zeichen nicht korrekt anzeigt. Weitere Informationen zu Client-Zeichensätzen finden Sie unter Verbindungszeichensätze und Sortierungen.
Daher konnte ich die Zeichensätze von MySQL Workbench nicht mit my.cnf-Änderungen überschreiben. zB 'set names utf8mb4'
quelle
Wenn Sie durch Ihre Einstellung für Client verwirrt sind und conn nach dem Neustart des MySQL-Dienstes zurückgesetzt wird. Probieren Sie diese Schritte aus (was bei mir funktioniert hat):
vi /etc/my.cnf
:wq [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
status;
. Sie finden den Zeichensatz für 'client' und 'conn' ist auf 'utf8' gesetzt.Überprüfen Sie die Referenz für weitere Informationen.
quelle
Sie können es so machen, wie es funktioniert, und wenn es nicht funktioniert, müssen Sie mysql neu starten.
quelle
MySQL-Zeichen ändern:
Klient
mysqld
Wir sollten nicht
default-character-set=utf8
in mysqld schreiben , da dies zu einem Fehler führen könnte wie:Zu guter Letzt:
quelle