Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

mysql + importando um arquivo com espaços nos cabeçalhos das colunas + como lidar


A instrução MySQL LOAD DATA carrega valores do arquivo por posição , não pelo nome.

O MySQL não tem nenhum requisito sobre os "nomes" dos campos (da linha de cabeçalho no arquivo .csv) "correspondendo" a nenhum nome de coluna. (É possível que algum outro componente do seu sistema tenha esse tipo de requisito, mas o MySQL LOAD DATA não.)

É válido para um arquivo .csv não ter uma linha de cabeçalho. Quando há uma linha de cabeçalho, normalmente "pulamos" usando IGNORE 1 LINES .

Como aparte, prefiro usar a palavra-chave FIELDS na instrução LOAD DATA no lugar de COLUMNS .

No MySQL, identificadores (nomes de colunas, nomes de tabelas) podem ser escapados usando caracteres de acento grave. Para usar um identificador que inclua caracteres inválidos, como um espaço, o identificador deve ter um escape.
CREATE TABLE ... 
... 
`Rec Open Date` DATE NOT NULL COMMENT 'Rec Open Date',
^             ^

No meu teclado, o backtick é a tecla no canto superior esquerdo ` ~ logo à esquerda do 1 ! chave.

ANSI_QUOTES

Se sql_mode variável inclui ANSI_QUOTES , você também pode usar aspas duplas para escapar dos identificadores. por exemplo.
SHOW VARIABLES LIKE 'sql_mode' ;

SET sql_mode = 'ANSI_QUOTES,...' ;

SHOW VARIABLES LIKE 'sql_mode'

Variable_name  Value        
-------------  -----------
sql_mode       ANSI_QUOTES  

Então:
CREATE TABLE ... 
... 
"Rec Open Date" DATE NOT NULL COMMENT 'Rec Open Date',
^             ^

Se sql_mode não inclua ANSI_QUOTES (explicitamente ou incluído em alguma outra configuração), as aspas duplas em torno dos identificadores não funcionarão. E usar aspas simples em torno de identificadores nunca deve funcionar... aspas simples envolvem literais de string.

O takeaway:use caracteres backtick para escapar identificadores (nomes de colunas, nomes de tabelas, etc.) e use aspas simples em torno de literais de string. Evite usar aspas duplas em literais de string, para fazer seu código SQL funcionar mesmo quando ANSI_QUOTES estiver definido.