Forum: PC Hard- und Software mysql: insert values mit Umlauten


von Daniel (Gast)


Lesenswert?

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?

von Iopodx (Gast)


Lesenswert?

0x8E ist jedenfalls kein Ä im Unicode....

von fbi (Gast)


Lesenswert?

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.

von Daniel (Gast)


Lesenswert?

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)

von fbi (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.