MySQL LOAD DATA-satsen laddar värden från filen efter position , inte vid namn.
MySQL har inga krav på att "namnen" på fälten (från rubrikraden i .csv-filen) "matchar" några kolumnnamn. (Det är möjligt att någon annan komponent i ditt system har den typen av krav, men det gör inte MySQL LOAD DATA.)
Det är giltigt för en .csv-fil att inte ha en rubrikrad. När det finns en rubrikrad "hoppar vi över" den med IGNORE 1 LINES
.
Till skillnad från det föredrar jag att använda nyckelordet FIELDS
i LOAD DATA-satsen istället för COLUMNS
.
I MySQL kan identifierare (kolumnnamn, tabellnamn) escapes med backtick-tecken. För att använda en identifierare som innehåller ogiltiga tecken, som ett mellanslag, måste identifieraren escapes.
CREATE TABLE ...
...
`Rec Open Date` DATE NOT NULL COMMENT 'Rec Open Date',
^ ^
På mitt tangentbord är backtick tangenten uppe till vänster ` ~ precis till vänster om 1 ! nyckel.
ANSI_QUOTES
Om sql_mode
variabel inkluderar ANSI_QUOTES
, då kan du också använda dubbla citattecken för att undvika identifierare. t.ex.
SHOW VARIABLES LIKE 'sql_mode' ;
SET sql_mode = 'ANSI_QUOTES,...' ;
SHOW VARIABLES LIKE 'sql_mode'
Variable_name Value
------------- -----------
sql_mode ANSI_QUOTES
Sedan:
CREATE TABLE ...
...
"Rec Open Date" DATE NOT NULL COMMENT 'Rec Open Date',
^ ^
Om sql_mode
gör inte inkludera ANSI_QUOTES
(antingen uttryckligen eller inkluderat i någon annan inställning), då fungerar inte de dubbla citattecken kring identifierare. Och att använda enstaka citattecken runt identifierare borde aldrig fungera... enstaka citattecken omsluter bokstavliga strängar.
Takeaway:använd backtick-tecken för att undkomma identifierare (kolumnnamn, tabellnamn, etc.) och använd enstaka citattecken runt bokstavliga strängar. Undvik att använda dubbla citattecken runt bokstavliga strängar för att få din SQL-kod att fungera även när ANSI_QUOTES är inställt.