Warum ist der standardmäßige Zeichensatz-Server latin1?

12

Ich benutze MySQL 5.5 und wenn ich Variablen über Zeichensatz zeige, habe ich

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

Soll ich brauche das zu ändern character_set_databaseund character_set_serverzu utf8?

Yoga
quelle

Antworten:

8

Denk darüber nach:

  • Sie speichern Daten in der Datenbank als latin1
  • Ihre Daten werden intern von mysqld als behandelt latin1

utf8Wie wird mysqld mit Daten umgehen, die vom Betriebssystem oder von der Verbindung stammen ?

Anstatt zu raten oder auf das Beste zu hoffen, können Sie das Verhalten des eingehenden Zeichensatzes ändern. Mit Ausnahme von information_schemaund mysqlnehmen Sie alle Ihre Datenbanken und setzen Sie den Standardzeichensatz auf utf8:

ALTER DATABASE dbname CHARACTER SET utf8;

Wenn Sie eine bestimmte Kolllation haben, gehen Sie folgendermaßen vor:

ALTER DATABASE dbname COLLATE 'utf8_general_ci';

Hier sind die Kollatierungen zur Auswahl:

mysql> select * from information_schema.collations where CHARACTER_SET_NAME = 'utf8';
+--------------------+--------------------+-----+------------+-------------+---------+
| COLLATION_NAME     | CHARACTER_SET_NAME | ID  | IS_DEFAULT | IS_COMPILED | SORTLEN |
+--------------------+--------------------+-----+------------+-------------+---------+
| utf8_general_ci    | utf8               |  33 | Yes        | Yes         |       1 |
| utf8_bin           | utf8               |  83 |            | Yes         |       1 |
| utf8_unicode_ci    | utf8               | 192 |            | Yes         |       8 |
| utf8_icelandic_ci  | utf8               | 193 |            | Yes         |       8 |
| utf8_latvian_ci    | utf8               | 194 |            | Yes         |       8 |
| utf8_romanian_ci   | utf8               | 195 |            | Yes         |       8 |
| utf8_slovenian_ci  | utf8               | 196 |            | Yes         |       8 |
| utf8_polish_ci     | utf8               | 197 |            | Yes         |       8 |
| utf8_estonian_ci   | utf8               | 198 |            | Yes         |       8 |
| utf8_spanish_ci    | utf8               | 199 |            | Yes         |       8 |
| utf8_swedish_ci    | utf8               | 200 |            | Yes         |       8 |
| utf8_turkish_ci    | utf8               | 201 |            | Yes         |       8 |
| utf8_czech_ci      | utf8               | 202 |            | Yes         |       8 |
| utf8_danish_ci     | utf8               | 203 |            | Yes         |       8 |
| utf8_lithuanian_ci | utf8               | 204 |            | Yes         |       8 |
| utf8_slovak_ci     | utf8               | 205 |            | Yes         |       8 |
| utf8_spanish2_ci   | utf8               | 206 |            | Yes         |       8 |
| utf8_roman_ci      | utf8               | 207 |            | Yes         |       8 |
| utf8_persian_ci    | utf8               | 208 |            | Yes         |       8 |
| utf8_esperanto_ci  | utf8               | 209 |            | Yes         |       8 |
| utf8_hungarian_ci  | utf8               | 210 |            | Yes         |       8 |
| utf8_sinhala_ci    | utf8               | 211 |            | Yes         |       8 |
+--------------------+--------------------+-----+------------+-------------+---------+
22 rows in set (0.03 sec)

Du könntest auch rennen

mysql> show collation where charset='utf8';
+--------------------+---------+-----+---------+----------+---------+
| Collation          | Charset | Id  | Default | Compiled | Sortlen |
+--------------------+---------+-----+---------+----------+---------+
| utf8_general_ci    | utf8    |  33 | Yes     | Yes      |       1 |
| utf8_bin           | utf8    |  83 |         | Yes      |       1 |
| utf8_unicode_ci    | utf8    | 192 |         | Yes      |       8 |
| utf8_icelandic_ci  | utf8    | 193 |         | Yes      |       8 |
| utf8_latvian_ci    | utf8    | 194 |         | Yes      |       8 |
| utf8_romanian_ci   | utf8    | 195 |         | Yes      |       8 |
| utf8_slovenian_ci  | utf8    | 196 |         | Yes      |       8 |
| utf8_polish_ci     | utf8    | 197 |         | Yes      |       8 |
| utf8_estonian_ci   | utf8    | 198 |         | Yes      |       8 |
| utf8_spanish_ci    | utf8    | 199 |         | Yes      |       8 |
| utf8_swedish_ci    | utf8    | 200 |         | Yes      |       8 |
| utf8_turkish_ci    | utf8    | 201 |         | Yes      |       8 |
| utf8_czech_ci      | utf8    | 202 |         | Yes      |       8 |
| utf8_danish_ci     | utf8    | 203 |         | Yes      |       8 |
| utf8_lithuanian_ci | utf8    | 204 |         | Yes      |       8 |
| utf8_slovak_ci     | utf8    | 205 |         | Yes      |       8 |
| utf8_spanish2_ci   | utf8    | 206 |         | Yes      |       8 |
| utf8_roman_ci      | utf8    | 207 |         | Yes      |       8 |
| utf8_persian_ci    | utf8    | 208 |         | Yes      |       8 |
| utf8_esperanto_ci  | utf8    | 209 |         | Yes      |       8 |
| utf8_hungarian_ci  | utf8    | 210 |         | Yes      |       8 |
| utf8_sinhala_ci    | utf8    | 211 |         | Yes      |       8 |
+--------------------+---------+-----+---------+----------+---------+
22 rows in set (0.00 sec)

mysql>

Um den einzelnen Zeichensatz einer Datenbank anzuzeigen, führen Sie Folgendes aus:

mysql> show create database sample;
+----------+-------------------------------------------------------------------+
| Database | Create Database                                                   |
+----------+-------------------------------------------------------------------+
| sample   | CREATE DATABASE `sample` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

Was die Einstellungen betrifft, könnten Sie dies versuchen:

Fügen Sie die Zeilen zu my.cnf

[mysqld]
character_set_database=utf8
character_set_server=utf8

Starten Sie dann mysql neu

Ich habe dies bereits am 01.08.2011 besprochen: Zeichensatzcodierung in einer Tabelle

CAVEAT (für MySQL DB Server unter Windows)

Diese Befehle

ALTER DATABASE dbname CHARACTER SET utf8;
ALTER DATABASE dbname COLLATE 'utf8_general_ci';

funktionieren in der Windows-Version von MySQL aufgrund der Art und Weise, wie Windows Dateien sperrt, nicht. Die benötigte Datei wird aufgerufen db.optund befindet sich im Datenbank-Unterordner in datadir.

Möglicherweise müssen Sie Folgendes tun:

  • mysqldump diese Datenbank (keine Datenbank erstellen Informationen, nur Tabellenerstellung und INSERTs)
  • Löschen Sie diese Datenbank
  • Erstellen Sie eine Datenbank mit dem spezifischen Zeichensatz und der Sortierung
  • lade im dump hinein nach

EPILOG

Unabhängig davon, was Sie tun, nehmen Sie Änderungen an einem Entwicklungs- / Staging-Server vor, um festzustellen, ob Sie die gewünschten Effekte erzielen

UPDATE 2012-12-05 11:00 EDT

Deine Fragen

Soll ich es wirklich ändern?

Um die ordnungsgemäße Verarbeitung der Daten zu gewährleisten, sollten Sie sicherstellen, dass Sie Äpfel an Äpfel haben. Daten, die als ein Zeichensatz vorbereitet und in eine Tabelle mit der Datenbank geladen wurden, werden möglicherweise so ausgerichtet, als würde ein anderer Zeichensatz die Daten nicht mit dem Zeichensatz anzeigen, den mysqld beim Abrufen und Zurücksenden an eine DB-Verbindung sieht. Versuchen Sie, die Datenbank auf einen Entwicklungs- / Staging-Server zu laden, und experimentieren Sie mit dem Festlegen von Standardzeichensätzen.

Warum werden utf8einige Standardeinstellungen verwendet, andere jedoch latin1?

Dies hängt von der Betriebssystemversion der MySQL-Binärdatei ab. Windows-Versionen können haben, latin1während Linux-Versionen verwenden können utf8.

RolandoMySQLDBA
quelle
Hallo, danke für deine ausführliche Antwort. Eigentlich geht es bei meinen Fragen nicht darum, wie man es ändert, sondern ... 1. Soll ich es wirklich ändern? 2. Warum einige Standardeinstellungen utf8 verwenden, aber einige Standardeinstellungen latin1 verwenden
Yoga
1
(Nochmals vielen Dank) Dies hängt von der Betriebssystemversion von MySQL Binary ab. <- Ich meine, wenn ich auf Ubuntu bin, warum ist die Standardeinstellung gemischt zwischen latin1und utf8, zB character_set_connectionist utf8, aber character_set_databaselatin1
Yoga
1
@ Rolando [mysqld] character_set_database=utf8 character_set_server=utf8funktioniert nicht.
Jorge B.
Ich verstehe es immer noch nicht ... selbst wenn das Host-Betriebssystem einen albern eingeschränkten Zeichensatz verwendet, sollte die Datenbank nicht standardmäßig Text in einem Zeichensatz speichern, der ein beliebiges Zeichen darstellen kann, selbst wenn er Eingaben akzeptiert latin1und konvertieren muss zur Aufbewahrung?
Andy