Ändern Sie den MySQL-Standardzeichensatz in my.cnf auf UTF-8?

334

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?

Jorre
quelle
19
Beachten Sie, dass ein besserer Standardwert wäre utf8mb4, dh echtes UTF-8 mit vollständiger Unicode-Unterstützung. Siehe So unterstützen Sie vollständigen Unicode in MySQL-Datenbanken .
Mathias Bynens
@Jorre Würden Sie dagegen sein, dies so zu ändern, dass utf8mb4dies ein gefährlicher Präzedenzfall ist?
Evan Carroll

Antworten:

424

Um die Standardeinstellung auf UTF-8 festzulegen, möchten Sie my.cnf Folgendes hinzufügen

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

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.

NinjaCat
quelle
18
Die obigen my.cnf-Einstellungen haben auch für mich funktioniert. Außerdem musste ich sicherstellen, dass die Tabelle richtig eingestellt war, z. B. ALTER TABLE TableCONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Chris Livdahl
8
Funktioniert nicht für MySQL 5.5. Ich habe verwendet: <br/> [mysqld] # Änderungen für utf-8-Kollatierungsserver = utf8mb4_unicode_ci init-connect = 'SET NAMES utf8mb4' Zeichensatzserver = utf8mb4 und utf8mb4 an anderer Stelle, wie oben erwähnt.
Champ
12
Unter Ubuntu 12.04 funktionierte dies für mich - wenn ich die erste Zeile danach entfernte [mysqld].
Brandon Bertelsen
4
Es sieht so aus, als ob der Standardzeichensatz im Abschnitt [mysqld] nicht mehr erlaubt ist
Marsbard
4
Beachten Sie, dass Sie den utf8Zeichensatz von MySQL nicht verwenden sollten, wenn Sie UTF-8 verwenden möchten . Verwenden Sie utf8mb4stattdessen.
Mathias Bynens
255

Für die aktuelle Version von MySQL gilt:

default-character-set = utf8

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:

  1. Entfernen Sie diese Anweisung und Sie sollten gut sein.

  2. Dann sollte Ihre Konfigurationsdatei (z. B. '/etc/my.cnf') folgendermaßen aussehen:

    [mysqld]
    collation-server = utf8_unicode_ci
    init-connect='SET NAMES utf8'
    character-set-server = utf8
  3. Starten Sie MySQL neu.

  4. Führen Sie die folgenden Abfragen in Ihrer MySQL-Eingabeaufforderung aus, um sicherzustellen, dass MySQL UTF-8 ist:

    • Erste Abfrage:

       mysql> show variables like 'char%';

      Die Ausgabe sollte folgendermaßen aussehen:

       +--------------------------+---------------------------------+
       | Variable_name            | Value                           |
       +--------------------------+---------------------------------+
       | character_set_client     | utf8                            |
       | character_set_connection | utf8                            |
       | character_set_database   | utf8                            |
       | character_set_filesystem | binary                          |
       | character_set_results    | utf8                            |
       | character_set_server     | utf8                            |
       | character_set_system     | utf8                            |
       | character_sets_dir       | /usr/local/mysql/share/charsets/|
       +--------------------------+---------------------------------+
    • Zweite Abfrage:

       mysql> show variables like 'collation%';

      Und die Abfrageausgabe lautet:

       +----------------------+-----------------+
       | Variable_name        | Value           |
       +----------------------+-----------------+
       | collation_connection | utf8_general_ci |
       | collation_database   | utf8_unicode_ci |
       | collation_server     | utf8_unicode_ci |
       +----------------------+-----------------+
Mustafah
quelle
Hat Ihre erste Zeile max_allowed_packet = 64M in irgendeiner Weise mit diesem UTF8-Problem zu tun?
Malhal
Ich habe character_set_filesystem | utf8. Ich bin mir nicht sicher, ist es in Ordnung?
Onkel Lem
1
Versucht auf MariaDB v5.5 und es funktioniert, danke! mysql Ver 15.1 Distrib 5.5.35-MariaDB, for debian-linux-gnu (x86_64) using readline 5.1
Cenk
Ich denke, Sie müssen nicht entfernen default-character-set, sondern können zu loose-default-character-set = utf8"lose" wechseln. Das mysqlbinlogfreut mich, wenn Sie es brauchen - google für: "lose Standard-Zeichensatz" mysqlbinlog .
KajMagnus
Ist das init-connect='SET NAMES utf8'wirklich nötig? Wenn nicht, können wir definitiv auf die Leistung verzichten.
datasn.io
56

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

mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

Konfig

# 💩 𝌆
# UTF-8 should be used instead of Latin1. Obviously.
# NOTE "utf8" in MySQL is NOT full UTF-8: http://mathiasbynens.be/notes/mysql-utf8mb4

[client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

[mysql]
default-character-set = utf8mb4

Neue Einstellungen

mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES 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                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

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):

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

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.

basic6
quelle
Ich habe Ihre Einstellungen befolgt, aber ich finde, character_set_databaseist immer noch utf8und collation_databaseist utf8_bin`. Habe ich etwas verpasst?
Stewart
Gefunden, was ich vermisst habe. Diese beiden Einstellungen werden beim Erstellen der Datenbank selbst festgelegt. Siehe diese Frage; stackoverflow.com/questions/22572558/…
Stewart
1
character-set-client-handshake = FALSEZum Abschnitt [mysqld] hinzufügen , damit immer die Standardcodierung verwendet wird, auch wenn Sie auf der Anwendungsebene einen Fehler machen
Lukas Liesis
Hallo, ich habe diese Lösung ausprobiert, kann aber trotzdem charakter_set_client | nicht anzeigen utf8mb4. es ist utf8. Nur Character_set_Database utf8mb4 und Character_set_server utf8mb4 sind utf8mb4, andere nicht geändert. Bitte helfen Sie mir
Bhavin Chauhan
@ baic6 Ich schlage vor, einen Hinweis hinzuzufügen, der verdeutlicht, warum nur indizierte Spalten das Problem verursachen können. Die Beschränkung auf 767 Bytes gilt nur für indizierte Spalten, da die Beschränkung für "Schlüssel" gilt. Für nicht indizierte Spalten gilt dies im Allgemeinen nicht. Wenn eine Spalte einen Wert mit maximaler Bytelänge hätte, beispielsweise 255 Zeichen, und die maximal 3 Bytes von utf8 verwendet würden, würde sie immer noch nur 255 * 3 Bytes benötigen. Utf8mb4 verwendet in diesen Fällen nur 3 Bytes, da diese Zeichen auch in utf8mb4 verwendet werden brauche nur 3 Bytes. Das heißt, es sei denn, ein Zeichen, das nicht in utf8 passt, wurde in der Spalte gespeichert. In diesem Fall gehen die Informationen bereits verloren.
Sam
55

Unter MySQL 5.5 habe ich in my.cnf

[mysqld] 
init_connect='SET collation_connection = utf8_unicode_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8 
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

Ergebnis ist

mysql> show variables like "%character%";show variables like "%collation%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
Tomazzlender
quelle
2
Was macht skip-character-set-client-handshakegenau und unter welchen Umständen ist es erforderlich?
Simon East
3
@ Simon, bei der Verwendung show variables like "%collation%";sah ich 'collation_connection' als utf8_general_ciund collation_database und collation_server als utf8_unicode_ci. Durch Hinzufügen der Zeile wurde skip-character-set-client-handshakeder allgemeine Eintrag in Unicode geändert, sodass alle drei konsistent waren.
Vaughany
2
Unter MySQL 5.6 macht der Skip-Character-Set-Client-Handshake nicht das, was @Vaughany gesagt hat. Irgendein Vorschlag?
Ababneh A
4
Das skip-character-set-client-handshakehat es für mich getan (zusammen mit dem "Zeichensatz-Server" und dem "Kollatierungs-Server" natürlich - auf Debian 7). Das init_connects machte mit oder ohne das keinen Unterschied skipund schien überflüssig. +1 und danke.
Jeff
3
Überspringen des Zeichensatz-Client-Handshakes ignoriert die vom Client gesendeten Zeichensatzinformationen. Es ist schön, einen bestimmten Zeichensatz während der Kommunikation zu erzwingen, aber wenn der Client etwas anderes erwartet, kann dies zu Problemen führen. Ich würde sagen, Sie sollten dies besser auf dem Client (Ihrer Anwendung) angeben.
0b10011
31

Hinweis: Die Datei my.cnf befindet sich unter/etc/mysql/

Nach dem Hinzufügen dieser Zeilen:

[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
skip-character-set-client-handshake

[client]
default-character-set   = utf8

[mysql]
default-character-set   = utf8

Vergessen Sie nicht, den Server neu zu starten:

sudo service mysql restart
М.Б.
quelle
2
Hinweis: Dadurch werden die Standardeinstellungen geändert. Die Codierung für vorhandene Spalten wird nicht geändert.
Rick James
24

NijaCat war nah dran, aber Overkill angegeben:

Um die Standardeinstellung auf UTF-8 festzulegen, möchten Sie my.cnf Folgendes hinzufügen

[client]
default-character-set=utf8

[mysqld]
default-character-set = utf8

Dann, um zu überprüfen:

mysql> show variables like "%character%";show variables like "%collation%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
Derek
quelle
5
Gute Antwort. Vielleicht würde eine kurze Erklärung darüber, welche Teile übertrieben sind, den Leuten helfen, genau zu entscheiden, was sie in ihrer Konfiguration wollen.
Mike Samuel
@Derek, was macht [mysql] default-character-set=utf8dann?
Pacerier
1
Die Optionsgruppe [client] legt bereits Optionen für alle MySQL-Clients fest, die die Datei my.cnf lesen. Die Gruppe [mysql] legt Optionen nur für die Client-Binärdatei "mysql" fest. Wenn Sie eine MySQL-Option festlegen möchten, die nicht für andere Clients gilt, ist die Verwendung dieser Gruppe angemessen. Das Festlegen des gleichen Optionswerts an beiden Standorten ist jedoch redundant. dev.mysql.com/doc/refman/5.6/en/option-files.html
Derek
@Mike Samuel, das Setzen des Standardzeichensatzes auf utf8 impliziert bereits den Standardkollatierungsmodus von utf8_general_ci. Auf der anderen Seite ist "init-connect = 'SET NAMES utf8'" eine etwas interessante Idee, da versucht wird, alle Clients, die eine Verbindung zum Server herstellen, zur Verwendung von utf8 zu zwingen. Dies wird jedoch abhängig von den Verbindungsberechtigungen der Verbindung inkonsistent angewendet Benutzer und ich vermuten, dass einige verbindende Clients von Drittanbietern verwirrt sein könnten, wenn der Server den von ihnen angeforderten Zeichensatz überschreibt. dev.mysql.com/doc/refman/5.6/en/charset-applications.html
Derek
Zur [mysqld]Verwendung character-set-serveranstelle vondefault-character-set
Rick James
23

Ich habe auch herausgefunden, dass MySQL 5.5.x nach dem Einstellen default-character-set = utf8unter [mysqld]Titel nicht unter Ubuntu 12.04 (Precise Pangolin) gestartet werden würde .

amiroff
quelle
16
Das ist der MySQL-Fehler # 52047 . Unter [mysqld]sollten Sie character-set-serveranstelle von verwenden default-character-set. (Sehr verwirrend, ich stimme zu!)
Mathias Bynens
Ja. Veraltet in 5.0; entfernt in 5.5.
Rick James
22

MySQL v5.5.3 und höher:

Fügen Sie einfach drei Zeilen nur im Abschnitt [mysqld] hinzu:

[mysqld]
character-set-server = utf8
collation-server = utf8_unicode_ci
skip-character-set-client-handshake

Hinweis:skip-character-set-client-handshake Wenn Sie hier einschließen, müssen Sie nicht mehr init-connectin [mysqld]und default-character-setin die Abschnitte [client]und einschließen [mysql].

mug896
quelle
1
Wow, so viele doppelte Antworten auf diese Frage, und doch scheint dies die einfachste zu sein. Funktioniert auch für mich auf v5.5.44.
Justin Watt
9

Unter Xubuntu 12.04 habe ich einfach hinzugefügt

[mysqld]
character_set_server = utf8

zu /etc/mysql/my.cnf

Und das Ergebnis ist

mysql> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

Schauen Sie sich auch http://dev.mysql.com/doc/refman/5.6/en/charset-server.html an

Falko
quelle
Sie benötigen außerdem [client] default-character-set = utf8. Andernfalls wird utf8 bei Verwendung von mysql in der Befehlszeile nicht verwendet, wodurch möglicherweise Backups zerstört werden, die Sie an eine Datei weiterleiten.
Malhal
9

Alle hier aufgeführten Einstellungen sind korrekt, aber hier ist die optimalste und ausreichendste Lösung:

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
character-set-server = utf8
collation-server = utf8_unicode_ci

[client]
default-character-set = utf8

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:

mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

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.:

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci | <---
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

Benutzer mit Nicht-SUPER- Privilegien:

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

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.

gahcep
quelle
3
Ich wünschte, ich könnte Ihren verlinkten Artikel lesen, kann aber kein Russisch lesen und Google Übersetzer ist für technische Texte nicht so hilfreich. Soweit ich das beurteilen kann, wäre es sehr interessant. Würden Sie bitte eine englische Version veröffentlichen?
Martijn Heemels
2
Können Sie erklären, welche Einstellung die Sortierung der SUPER-Benutzerverbindung nicht festlegt? (und gibt es eine Lösung)
KCD
@gahcep, Sie haben angegeben, dass Sie utf8_unicode_ciaufgrund von Leistungsproblemen verwenden. Warum also nicht utf8_binstattdessen verwenden?
Pacerier
Hallo Paceriar. Guter Punkt. Jetzt bin ich mir nicht sicher, ob meine Wahl überhaupt richtig war utf8_unicode_ci. Ich habe nie Zeit damit verbracht, die Leistung zu testen.
Gahcep
4

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] 
init_connect='SET collation_connection = utf8_unicode_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8 
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

[mysqld]

Dadurch wird collation_connection in utf8_unicode_ci geändert

init_connect='SET collation_connection = utf8_unicode_ci'

Verwenden von SET NAMES:

init_connect='SET NAMES utf8'

Die SET NAMES beeinflussen drei Zeichen, dh:

character_set_client
character_set_results
character_set_connection

Dies wird eingestellt character_set_database & character_set_server

character-set-server=utf8

Dies wirkt sich nur auf collation_database & collation_server aus

collation-server=utf8_unicode_ci

Entschuldigung, ich bin mir nicht so sicher, wofür das ist. Ich benutze es jedoch nicht:

skip-character-set-client-handshake
Lihang Li
quelle
Die Dokumentation enthält Hinweise, character_set_serverdie nicht manuell eingestellt werden sollten.
Brian
Wie sieht der Ansatz auf dem neuesten Stand der Technik aus? Wir können das character setbeim Aufbau einer Datenbankverbindung explizit übergeben , sehen aber etwas nervig aus.
Lihang Li
Eigentlich habe ich einen Fehler gemacht. In den Dokumentationen heißt es, dass charakter_set_Datenbank nicht dynamisch festgelegt werden sollte. Erwähnt nicht character_set_server. Ich bin mir jedoch nicht sicher, ob Sie sich um character_set_server sorgen müssen, da dies meiner Meinung nach nur den Standardwert für eine neu erstellte Datenbank betrifft.
Brian
Wie ich oben erwähnt habe und das Experiment gerade wieder durchgeführt habe, wird sich character_set_serverim [mysqld]Abschnitt auf character_set_databaseund auswirken character_set_server. Ich denke, es empfiehlt sich, explizit darauf hinzuweisen character set, was Sie beim Erstellen einer Datenbank, einer Tabelle und einer Datenbankverbindung verwenden möchten. Ehrlich gesagt ist die Dokumentation von mysqlnicht so leicht zu verstehen. Wissen Sie , ob es eine generische Art und Weise ist es, alle zu erhalten character setund collationin mysql Einstellungen gemacht?
Lihang Li
4

Auf Fedora 21

$ vi /etc/my.cnf

Hinzufügen folgen:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

Speichern und schließen.

Letzte Erinnerung Neustart Service mysqld mit service mysqld restart.

Nguyễn Văn Tiến
quelle
1

MySQL 5.5, alles was Sie brauchen ist:

[mysqld]
character_set_client=utf8
character_set_server=utf8
collation_server=utf8_unicode_ci

collation_server es ist optional.

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
Gajus
quelle
1

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'

Paiego
quelle
1

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):

  1. vi /etc/my.cnf
  2. fügen Sie den Inhalt Schlag und :wq [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
  3. Starten Sie MySQL neu und melden Sie sich bei MySQL an. Verwenden Sie die Datenbank und den Eingabebefehl status;. Sie finden den Zeichensatz für 'client' und 'conn' ist auf 'utf8' gesetzt.

Überprüfen Sie die Referenz für weitere Informationen.

John Wen
quelle
0

Sie können es so machen, wie es funktioniert, und wenn es nicht funktioniert, müssen Sie mysql neu starten.

郭浩伟
quelle
-1

MySQL-Zeichen ändern:

Klient

default-character-set=utf8

mysqld

character_set_server=utf8

Wir sollten nicht default-character-set=utf8in mysqld schreiben , da dies zu einem Fehler führen könnte wie:

Start: Job konnte nicht gestartet werden

Zu guter Letzt:

 +--------------------------+----------------------------+
 | Variable_name            | Value                      |
 +--------------------------+----------------------------+
 | character_set_client     | utf8                       |
 | character_set_connection | utf8                       |
 | character_set_database   | utf8                       |
 | character_set_filesystem | binary                     |
 | character_set_results    | utf8                       |
 | character_set_server     | utf8                       |
 | character_set_system     | utf8                       |
 | character_sets_dir       | /usr/share/mysql/charsets/ |
 +--------------------------+----------------------------+
MYLOGOS
quelle