370 Stimmen

Den Standardzeichensatz von MySQL in der Datei my.cnf auf UTF-8 ändern?

Derzeit verwenden wir die folgenden Befehle in PHP, um den Zeichensatz zu setzen UTF-8 in unserer Anwendung.

Da dies ein wenig Overhead bedeutet, würden wir dies gerne 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 dort steht nichts über Zeichensätze.

Zu diesem Zeitpunkt habe ich die Variablen für den MySQL-Zeichensatz und die Sortierung wie folgt auf UTF-8 gesetzt:

skip-character-set-client-handshake
character_set_client=utf8
character_set_server=utf8

Ist das der richtige Weg, dies zu tun?

486voto

NinjaCat Punkte 9681

Um die Standardeinstellung auf UTF-8 zu setzen, müssen Sie Folgendes zu my.cnf/my.ini hinzufügen

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
collation-server = utf8mb4_unicode_520_ci
init-connect='SET NAMES utf8mb4'
character-set-server = utf8mb4

Wenn Sie den Zeichensatz für eine bestehende DB ändern wollen, lassen Sie es mich wissen... Ihre Frage hat es nicht direkt spezifiziert, also bin ich nicht sicher, ob es das ist, was Sie tun wollen.

Bearbeiten: Ich ersetzte utf8 mit utf8mb4 in der ursprünglichen Antwort aufgrund von utf8 nur eine Untermenge von UTF-8 ist. MySQL und MariaDB nennen beide UTF-8 utf8mb4 .

263voto

Mustafah Punkte 4397

Für die aktuelle Version von MySQL,

default-character-set = utf8

verursacht ein Problem. Ich glaube, es ist veraltet.

Als Justin Ball sagt in " Upgrade auf MySQL 5.5.12 und jetzt lässt sich MySQL nicht mehr starten dann sollten Sie das tun:

  1. Entfernen Sie diese Richtlinie und Sie sollten zufrieden sein.

  2. Ihre Konfigurationsdatei (z. B. "/etc/my.cnf") sollte dann so aussehen:

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

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

    • Erste Anfrage:

       mysql> show variables like 'char%';

      Die Ausgabe sollte wie folgt 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 Anfrage:

       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 |
       +----------------------+-----------------+

65voto

basic6 Punkte 3313

Auf diese Frage gibt es 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 sind Abgeschnitten beim Einfügen ). Ich halte dies für einen wichtigen Unterschied. Hier ist also eine weitere Antwort auf die Frage, wie man den Standardzeichensatz und die Sortierung einstellt. Eine, die es Ihnen erlaubt, einen Haufen Kacke () einzufügen.

Dies funktioniert mit MySQL 5.5.35.

Beachten Sie, dass einige der Einstellungen optional sein können. Da ich nicht ganz sicher bin, dass ich nichts 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)

Konfigurieren Sie

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

zeichensatz_system ist immer utf8 .

Dies hat keine Auswirkungen auf bestehende Tabellen, es ist lediglich die Standardeinstellung (für neue Tabellen). Das Folgende ALTER-Code kann verwendet werden, um eine bestehende Tabelle zu konvertieren (ohne die Umgehung von dump-restore):

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: character_set_client, character_set_connection, character_set_results, collation_connection bleiben auf latin1. Ausgabe von SET NAMES utf8 (utf8mb4 ist in dieser Version nicht verfügbar) setzt diese ebenfalls auf utf8.


Caveat : Wenn Sie eine utf8-Tabelle mit einer Indexspalte vom Typ VARCHAR(255) haben, kann diese in manchen Fällen nicht konvertiert werden, weil 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 (denn 191 * 4 = 764 < 767 < 192 * 4 = 768). Danach kann die Tabelle umgerechnet werden.

55voto

tomazzlender Punkte 1113

Bei 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

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_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

36voto

М.Б. Punkte 1200

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X