load data infile => leere Einträge zu 0 statt zu NULL

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
klaus
Beiträge: 102
Registriert: 09.06.2003 11:32:10

load data infile => leere Einträge zu 0 statt zu NULL

Beitrag von klaus » 11.09.2006 21:20:42

Moin,

ich möchte in eine MySQL-Datenbank Werte aus einer .csv-Datei laden,
allerdings werden aus allen leeren Einträgen 0 statt NULL,
das Feld ist double NULL erlaubt und Standard.
Mein Befehl lautet:


mysql> load data infile '/home/weizen/wiederholungen/SeptoriaBSB_wiederholungen.csv' into table BSBWied fields terminated by ';' enclosed by '\"' lines terminated by '\r\n' ignore 2 lines (Jahr, Standort, Sorte, Wiederholung, F7_T1, F7_T2, F7_T3, F7_T4, F7_T5, F7_T6, F7_T7, F7_T8, F7_T9, F7_T10, F7_T11, F7_T12, F7_T13, F7_T14, F6_T1, F6_T2, F6_T3, F6_T4, F6_T5, F6_T6, F6_T7, F6_T8, F6_T9, F6_T10, F6_T11, F6_T12, F6_T13, F6_T14, F5_T1, F5_T2, F5_T3, F5_T4, F5_T5, F5_T6, F5_T7, F5_T8, F5_T9, F5_T10, F5_T11, F5_T12, F5_T13, F5_T14, F4_T1, F4_T2, F4_T3, F4_T4, F4_T5, F4_T6, F4_T7, F4_T8, F4_T9, F4_T10, F4_T11, F4_T12, F4_T13, F4_T14, F3_T1, F3_T2, F3_T3, F3_T4, F3_T5, F3_T6, F3_T7, F3_T8, F3_T9, F3_T10, F3_T11, F3_T12, F3_T13, F3_T14, F2_T1, F2_T2, F2_T3, F2_T4, F2_T5, F2_T6, F2_T7, F2_T8, F2_T9, F2_T10, F2_T11, F2_T12, F2_T13, F2_T14, F1_T1, F1_T2, F1_T3, F1_T4, F1_T5, F1_T6, F1_T7, F1_T8, F1_T9, F1_T10, F1_T11, F1_T12, F1_T13, F1_T14, F0_T1, F0_T2, F0_T3, F0_T4, F0_T5, F0_T6, F0_T7, F0_T8, F0_T9, F0_T10, F0_T11, F0_T12, F0_T13, F0_T14)


Was mache ich falsch?

Eine Zele des csv-Datei sieht folgendermaßen aus:

2001;Marienkoog;Ritmo;b;;;;;;;;;;;;;;;;;113.3;98.3;243.8;;;;;;;;;;;;142.5;4.5;38.8;58;203;95.6;162.5;;;;;;;;2.7;0;0;9;33.9;26.8;57.6;60.1;66;72;;;;;;;;;4.7;2.5;5.9;6.5;28.8;29.7\
;76;;;;;;;;0;0;0;0;9.9;15.4;81.5;;;;;;;;0;0;0.5;0;5.4;7.3;41.6;;;;;;;;;0;0;0;2.3;1.6;17.6

Bin leider verzweifelt und weiß auch nicht wirklich wie ich googeln soll.

DANKE
Matthias

Benutzeravatar
finupsen
Beiträge: 1327
Registriert: 21.04.2004 20:07:05
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Beitrag von finupsen » 11.09.2006 21:27:38

hallo,
Ich hoffe mal ich habs richtig verstanden... ;)
Ein feld "Double" kann keinen string wie "NULL" aufnehmen, daher wird 0 geschrieben.
Lösung wäre, das feld als varchar und default auf "NULL" setzen...
Allerdings sind dann auch nicht-leere einträge varchar. Leider geht nur eins von beiden.

Da kannst aber auch bei der abfrage aus einer "0" ein "NULL" machen
http://dev.mysql.com/doc/refman/4.0/de/ ... tions.html
Niemand hat vor eine zentrale Datensammelbehörde aufzubauen. Es handelt sich vielmehr um dezentrale IT-Systeme die miteinander vernetzt werden.
... und Wasser ist naß.

klaus
Beiträge: 102
Registriert: 09.06.2003 11:32:10

Beitrag von klaus » 11.09.2006 21:45:44

Moin finupsen,

ich möchte, dass es ein Unterschied ist, ob kein Eintrag für die Variable da ist
oder eine 0.
Für kein Eintrag soll NULL bei einer Abfrage erscheinen.
Das Feld soll schon double bleiben

Trotzdem DANKE
Matthias.

Benutzeravatar
finupsen
Beiträge: 1327
Registriert: 21.04.2004 20:07:05
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Beitrag von finupsen » 11.09.2006 22:01:30

hmmm,

Wenn ein feld double ist und du trägst dort "nichts" ein dann ist der wert=0 .

soweit ok ?

Du kannst felder nicht einfach so mischen.

auch ok ?

Dir bleibt dann nur die möglichkeit das ganz als varchar zu speichern und später bei der
abfrage den typ wieder nach double umzuwandeln. Die leeren felder im csv kannste ja mit
einem regex durch "null" ersetzen.
Niemand hat vor eine zentrale Datensammelbehörde aufzubauen. Es handelt sich vielmehr um dezentrale IT-Systeme die miteinander vernetzt werden.
... und Wasser ist naß.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 12.09.2006 08:33:05

finupsen hat geschrieben: Ein feld "Double" kann keinen string wie "NULL" aufnehmen, daher wird 0 geschrieben.
Lösung wäre, das feld als varchar und default auf "NULL" setzen...
Bei relationalen Datenbanksystemen, können Felder auch "nullable" definiert werden, sprich diese Felder können ENTWEDER einen Wert vom entsprechenden Typ haben ODER keinen Wert (=NULL) besitzen.

@klause
du wirst die Felder als "nullable" definieren müssen, poste bitte einmal die Ausgabe von "describe BSBWied"

Code: Alles auswählen

root@csxgen4:~# cat test.csv
1;0.1
2
3;5.4
root@csxgen4:~# mysql
mysql> load data infile '/root/test.csv' into table test fields terminated by ';' ignore 0 lines (id,col);
Query OK, 3 rows affected, 1 warning (0.00 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 1

mysql> select * from test;
+----+------+
| id | col  |
+----+------+
|  1 |  0.1 |
|  2 | NULL |
|  3 |  5.4 |
+----+------+
3 rows in set (0.00 sec)
Gruß
gms

Benutzeravatar
finupsen
Beiträge: 1327
Registriert: 21.04.2004 20:07:05
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Beitrag von finupsen » 12.09.2006 09:21:28

hi,

Will ich dir gerne glauben, aber wie definiert man ein feld als "nullable" konkret ?
Niemand hat vor eine zentrale Datensammelbehörde aufzubauen. Es handelt sich vielmehr um dezentrale IT-Systeme die miteinander vernetzt werden.
... und Wasser ist naß.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 12.09.2006 09:30:35

in dem an die Typdefinition "null" oder "not null" angehängt wird ( bei vielen DBMS ist "null" die default Einstellung)
z.B

Code: Alles auswählen

create table test (id integer not null, col double null, primary key(id));
@klaus
"load data" scheint da wirklich etwas hatschert implementiert bzw designed worden zu sein. In deinem CSV File wirst du wahrscheinlich, NULL oder \N einfügen müssen

Code: Alles auswählen

perl -pe 's/^;/\\N;/;s/;(?=;|$)/;\\N$1/g;' in.csv >out.csv
Gruß
gms

Benutzeravatar
finupsen
Beiträge: 1327
Registriert: 21.04.2004 20:07:05
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Beitrag von finupsen » 12.09.2006 09:41:12

also, hab ich jetzt mal probiert:

CREATE TABLE test (dtest double default NULL)
INSERT INTO test ( dtest ) VALUES ('');

mysql> select * from test;
+-------+
| dtest |
+-------+
| 0 |
+-------+

Das selbe auch mit "not null"...
Also muss er doch zwangläufig die leeren felder durch "null" erstezen, oder nich ?
Niemand hat vor eine zentrale Datensammelbehörde aufzubauen. Es handelt sich vielmehr um dezentrale IT-Systeme die miteinander vernetzt werden.
... und Wasser ist naß.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 12.09.2006 09:47:44

Code: Alles auswählen


mysql> create table test (id integer not null, dtest double, primary key(id));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test (id) values (1);
Query OK, 1 row affected (0.01 sec)

mysql> insert into test (id,dtest) values (2,null);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+----+-------+
| id | dtest |
+----+-------+
|  1 |  NULL |
|  2 |  NULL |
+----+-------+
2 rows in set (0.00 sec)


Antworten