Denk darüber nach:
- Sie speichern Daten in der Datenbank als
latin1
- Ihre Daten werden intern von mysqld als behandelt
latin1
utf8
Wie 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_schema
und mysql
nehmen 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.opt
und 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 utf8
einige Standardeinstellungen verwendet, andere jedoch latin1
?
Dies hängt von der Betriebssystemversion der MySQL-Binärdatei ab. Windows-Versionen können haben, latin1
während Linux-Versionen verwenden können utf8
.
latin1
undutf8
, zBcharacter_set_connection
ist utf8, abercharacter_set_database
latin1[mysqld] character_set_database=utf8 character_set_server=utf8
funktioniert nicht.latin1
und konvertieren muss zur Aufbewahrung?