CSVファイルをmysqlにインポートした時のエラー対応 ーー Incorrect integer value: '1' for column 'num' at row 1

mysqlCSVファイルをインポートしようとした時にエラーがでまくったところから解決までのメモメモ。。

CSVを普通に入れてみた

mysql> load data local infile '/home/user/Category.csv' into table categories fields terminated by ',' (num, name);

エラーでまくったのでエラー文言みてみると・・

mysql> show warnings; Incorrect integer value: '1' for column 'num' at row 1


半角数字の1が入っているはずなのにintegerじゃないと怒られる。
(数字やろなんやねんふざけんなとか言いながらすすめる・・・)

なんか一応データは入ってるみたい。

mysql> select * from categories;
+----+------+---------------------+
| id | num  | name                |
+----+------+---------------------+
           || ラーメン
               |肉
         |3 | ハンバーグ
               |食
               |華
               |ば
               |司
             |喫茶店
             |カレー
             |親子丼
       | 11 | うどん・そば
             |うどん
         |3 | イタリアン
           || ラーメン
               |肉
         |3 | ハンバーグ
               |食
               |華
               |ば
               |司
             |喫茶店
             |カレー
             |親子丼
       | 11 | うどん・そば
             |うどん
         |3 | イタリアン
+----+------+---------------------+
26 rows in set (0.00 sec)


でもぐちゃぐちゃ。。

mysql> select * from categories\G;


でやると綺麗にデータが見えるという謎。。

文字コードの問題かと思ったので調べてみた。

➜  ~  nkf --guess RestaurantCategory.csv
UTF-8 (CR)


大丈夫そう。

改行コードとか?

➜  ~  file Category.csv
Category.csv: UTF-8 Unicode (with BOM) text, with CRLF line terminators



お?CRLFってWindowsの改行コードだよな。ってことでUnixの改行コードに変更する。

➜  ~  tr -d \\r 
<Category.csv> LF_Category.csv



でもまだできず・・・。で、もう無理かと思ったところ
BOMありが原因になることあるよねーという記事を何処かで見つけて
あれ?確かwith BOMって、、

ってことでみてみると

➜  ~  file LF_Category.csv
LF_Category.csv: UTF-8 Unicode (with BOM) text



やっぱり。
ってことでuconvコマンドで変更できるみたいなので
コマンドがあるか確認。

➜  ~  uconv
zsh: correct 'uconv' to 'ujconv' [nyae]? n
zsh: command not found: uconv

ない。

入れてみる。

➜  ~  sudo yum install uconv -y

そんなのない

なんかicuで全部入ってくるみたいなので入れてみる

➜  ~  sudo yum install icu -y



➜  ~  uconv -f utf-8 -t utf-8 --remove-signature LF_Category.csv > no_bom_Category.csv
➜  ~  file no_bom_RestaurantCategory.csv
no_bom_RestaurantCategory.csv: UTF-8 Unicode text


うまくいった。

で、あとは

mysql> load data local infile '/home/user/Category.csv' into table categories fields terminated by ',' (num, name);

mysql> select * from categories;
+----+------+--------------------+
| id | num  | name               |
+----+------+--------------------+
|  1 |    1 | ラーメン             |
|  2 |    2 | 焼肉                   |
|  3 |    3 | ハンバーグ         |
|  4 |    4 | 定食                   |
|  5 |    5 | 中華                   |
|  6 |    6 | そば                   |
|  7 |    7 | 寿司                   |
|  8 |    8 | 喫茶店                |
|  9 |    9 | カレー                |
| 10 |   10 | 親子丼             |
| 11 |   11 | うどん・そば   |
| 12 |   12 | うどん             |
| 13 |   13 | イタリアン       |
+----+------+--------------------+
13 rows in set (0.00 sec)



きれいにできました。
この辺の知識なくてかなり手こずりましたが無事完了(・∀・)