Beim Konvertieren einer Datenbank in UTF-8 ist mir ein merkwürdiges Verhalten in Bezug auf die Steuerzeichen 0x80-0x9F aufgefallen. Zum Beispiel würde 0x92 (rechter Apostroph) nicht in UTF-8 konvertiert und der Rest des Inhalts einer Spalte mit dieser Methode abgeschnitten:
CREATE TABLE `bar` (
`content` text
) ENGINE=MyISAM DEFAULT CHARSET=latin1
INSERT INTO bar VALUES (0x8081828384858687898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F);
Query OK, 1 row affected (0.06 sec)
SELECT content FROM bar;
+---------------------------------------------------------------------------------+
| content |
+---------------------------------------------------------------------------------+
| €‚ƒ„…†‡‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ |
+---------------------------------------------------------------------------------+
1 row in set (0.06 sec)
ALTER TABLE bar CHANGE content content TEXT CHARACTER SET UTF8;
Query OK, 1 row affected, 1 warning (0.06 sec)
Records: 1 Duplicates: 0 Warnings: 1
SHOW WARNINGS;
+---------+------+-------------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\x80\x81\x82\x83\x84\x85...' for column 'content' at row 1 |
+---------+------+-------------------------------------------------------------------------------------+
1 row in set (0.06 sec)
SELECT * FROM bar;
+---------+
| content |
+---------+
| |
+---------+
1 row in set (0.06 sec)
Während normalerweise 0x80-0x9F in Latin1 nicht erlaubt ist, scheint MySQL anders damit umzugehen:
Latin1 von MySQL entspricht dem Windows-Zeichensatz cp1252. Dies bedeutet, dass es mit der offiziellen ISO 8859-1 oder IANA (Internet Assigned Numbers Authority) latin1 identisch ist, außer dass IANA latin1 die Codepunkte zwischen 0x80 und 0x9f als „undefiniert“ behandelt, während cp1252 und damit latS1 von MySQL Zeichen zuweisen für diese Positionen. [src]
MySQL kann den obigen Wertebereich jedoch nicht von seinem latein1-Zeichensatz in seinen UTF-8-Zeichensatz konvertieren.
Diese Zeichen werden durch Kopieren / Einfügen aus einem Word-Dokument (cp1252) in meine Datenbank aufgenommen, und obwohl ich möglicherweise einen Weg gefunden habe, die Anwendung dazu zu bringen, die richtigen UTF-8-Werte für neue Einträge zu erzwingen, muss ich sicherstellen, dass die alten abgerufen werden richtig konvertiert.
Gibt es in MySQL eine Möglichkeit, diese in das UTF-8-Äquivalent zu konvertieren, ohne jede Zeile jeder Textspalte durchzugehen und durch eine ASCII-freundliche Version zu ersetzen?
quelle
Antworten:
Ich bin nicht sicher. Ich habe versucht, Ihr Problem zu reproduzieren, aber die Änderung hat für mich gut funktioniert.
Hier sind meine verwandten Zeicheneinstellungen
Bearbeiten
Meine Zeicheneinstellungen vor dem Ausführen von Set-Namen utf8
Ausführung
quelle
Möglicherweise müssen Sie den Zeichensatz in cp1250 konvertieren, bevor Sie die Daten laden.
Ich habe das zuerst ausgeführt
cp1252 existiert hier nicht. Der nächste ist cp1250.
Versuchen Sie diese Sequenz:
und sehen, was passiert.
Ich habe dies in MySQL 5.5.19 unter Linux bekommen
und ich habe dies in MySQL 5.5.12 für Windows auf meinem Windows 7-Computer erhalten
Versuche es !!!
quelle