MySQLでTRUEorFALSEの値を持つ列にBOOLEAN型を指定しCSVインポートするとTRUEの値も0になる

# 原因

MySQLのBOOLEAN型では、0以外の "数値" をtrueと判定するから

# 対処

CSVのLOAD時に、BOOLEAN型の列をbooleanリテラルにSETし直す

# 具体例と説明

example.csv

name is_ok
A TRUE
B FALSE
C FALSE
D TRUE
E FALSE

### CREATE TABLE

CREATE TABLEをするときに、is_okカラムの型をBOOLEANに指定します

CREATE TABLE example_tb(
        name VARCHAR(10),
        is_ok BOOLEAN
    );

### LOAD DATA LOCAL INFILE(失敗例)

CSVをロードします


LOAD DATA LOCAL INFILE '/path/path/example.csv'
  INTO TABLE example_tb
  FIELDS
    TERMINATED BY ','
  IGNORE 1 LINES;

TRUEの値も全部0になってしまいます

f:id:n_k_j:20220319205654p:plain

### LOAD DATA LOCAL INFILE(成功例)

LOAD DATA LOCAL INFILE '/path/path/example.csv'
  REPLACE
  INTO TABLE example_tb
  FIELDS
    TERMINATED BY ','
  IGNORE 1 LINES
  (name, @is_ok)
  SET is_ok = IF(@is_ok='TRUE', true, false);

今度はうまく行きました

f:id:n_k_j:20220319205641p:plain

# 参考文献

参考とさせていただきました。

MySQL :: MySQL 8.0 Reference Manual :: 13.2.7 LOAD DATA Statement

MySQLでBOOLEAN型のカラムに'true'をINSERTするとfalseになる - Qiita