Auszug aus der Consolen Session, gestartet unter Cygwin mit mysql -u root -p password:***** mysql> create table ttt(t char(100)) CHARACTER SET utf8 COLLATE utf8_unicode_ci; mysql> insert into ttt values ("Ä"); ERROR 1366 (HY000): Incorrect string value: '\x8E' for column 't' at row 1 mysql> show create table ttt; +-------+--------------------------------------------------------------- -------- -----------------------------------------------------------------+ | Table | Create Table | +-------+--------------------------------------------------------------- -------- -----------------------------------------------------------------+ | ttt | CREATE TABLE `ttt` ( `t` char(100) COLLATE utf8_unicode_ci DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci | +-------+--------------------------------------------------------------- -------- -----------------------------------------------------------------+ 1 row in set (0.00 sec) Was könnte faul sein? Liegt es eventuell gar nicht am mysql sondern an cygwin Konsole?
Führ mal in der MySQL-Console folgendes aus:
1 | show variables like 'character_set%'; |
Eventuell siehst Du dann schon was schiefläuft. Abhilfe könnte dann einer der folgenden Zeilen bringen:
1 | set names 'latin1'; |
2 | set names 'cp850'; |
3 | set names 'cp1250'; |
Oder die MySQL-Console schon mit passenden Parametern aufrufen (bzw. in der ini verewigen). In der Windows-Shell kann man mit "mode con: codepage" schauen welche Codepage grade aktive ist, mit z.B. "mode con: codepage select=1250" auch passend umsetzen. Keine Ahnung wie das bei Cygwin geht.
mysql> show variables like "character_set%"; +--------------------------+-------------------------------------------- -------- -----+ | Variable_name | Value | +--------------------------+-------------------------------------------- -------- -----+ | character_set_client | cp1250 | | character_set_connection | cp1250 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | cp1250 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | C:\Program Files\MySQL\MySQL Server 5.1\share\chars ets\ | +--------------------------+-------------------------------------------- -------- -----+ 8 rows in set (0.00 sec) um cygwin auszuschliessen, habe ich nun main.sql Datei mit folgendem Inhalt angelegt. Diese wird dann mit source ausgeführt.
1 | drop database if exists checked; |
2 | create database checked; |
3 | use checked; |
4 | drop table if exists junk; |
5 | create table junk(x varchar(100)) charset utf8; |
6 | explain checked.junk; |
7 | insert into junk values ("hello"); |
8 | select * from junk; |
9 | insert into junk values("Ä"); |
10 | select * from junk; |
Der Fehler bleibt jedoch => cygwin als Ursache kann ausgeschlossen werden. Führe ich ...
1 | set names 'latin1'; |
2 | set names 'cp850'; |
3 | set names 'cp1250'; |
aus (eins nach dem anderen), und anschliessen wieder source main.sql Steht anstatt Ä einfach - +-------+ | x | +-------+ | hello | | ─ | +-------+ 2 rows in set (0.00 sec)
OK, dann landet der Datensatz zumindest schon mal in der Tabelle (das '-'). Die vom MySQL-Client und Cygwin verwendeten Codepages stimmen aber immer noch nicht, diesmal vermutlich allerdings bei der Ausgabe. Kannst ja mal mit einem anderen Client in die Tabelle schauen. Versuch mal das angehängte SQL-Script (main.sql):
1 | SET NAMES 'latin1'; |
2 | drop database if exists checked; |
3 | create database checked; |
4 | use checked; |
5 | drop table if exists junk; |
6 | create table junk(x varchar(100)) charset utf8; |
7 | explain checked.junk; |
8 | insert into junk values ("hello"); |
9 | select * from junk; |
10 | insert into junk values("Ä"); |
11 | SET NAMES 'cp850'; |
12 | select * from junk; |
Du kannst natürlich das Script selbs auch gleich als UTF8 speichern (siehe angehängte main2.sql).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.