mysql load data infile ツールでバックスラッシュを飼いならす方法:
ステップ 1、テーブルを作成します。
mysql> create table penguin (id int primary key, chucknorris VARCHAR(4000));
Query OK, 0 rows affected (0.01 sec)
ステップ 2、インポートするファイルを作成し、このデータをそこに配置します。
1 aliens are on route
2 scramble the nimitz\
3 \its species 8472
4 \\\\\\\\\\\\\\\\\\
5 Bonus characters:!@#$%^&*()_+=-[]\|}{;'":/.?>,< anything but tab
ステップ 3、テーブルに挿入します。
mysql> load data local infile '/home/el/foo/textfile.txt' into table penguin
fields terminated by '\t' lines terminated by '\n'
(@col1, @col2) set id=@col1, chucknorris=@col2;
Query OK, 4 rows affected, 1 warning (0.00 sec)
Records: 4 Deleted: 0 Skipped: 0 Warnings: 1
ステップ 4、そしてもちろん、この奇妙な出力が発生します。
mysql> select * from penguin;
+----+-----------------------------------------------------------------+
| id | chucknorris |
+----+-----------------------------------------------------------------+
| 1 | aliens are on route |
| 2 | scramble the nimitz
3 |
| 4 | \\\\\\\\\ |
| 5 | Bonus characters:!@#$%^&*()_+=-[]|}{;'":/.?>,< anything but tab |
+----+-----------------------------------------------------------------+
ステップ 5、警告を分析します。
mysql> show warnings;
+---------+------+--------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------- ------------------+
| Warning | 1262 | Row 2 was truncated; it contained more data than there |
| | | were input columns |
+---------+------+--------------------------------------------------------+
1 row in set (0.00 sec)
ステップ 6、何が悪かったのかを正確に考えます。
の左側にあるバックスラッシュnimitz
により、mysql ロード データ パーサーが 2 行目の末尾と 3 行目の先頭を連結しました。その後、タブにぶつかり、「nimitz\n3 を 2 行目にスクランブル」と入力しました。
its species 8472
余分な単語がどこにも収まらないため、行 3 の残りはスキップされ、上記の警告が生成されます。
行 4 には 18 個のバックスラッシュがあるため問題はなく、それぞれがエスケープされているため 9 個のバックスラッシュとして表示されます。奇数があった場合、行 2 のエラーは行 4 に発生します。
5行目のおまけキャラは普通に出てきました。タブ以外はすべて許可されます。
ステップ 7、ペンギンのリセット:
mysql> delete from penguin;
ステップ 8、fields escaped by
句を使用してテーブルにロードします。
mysql> load data local infile '/home/el/foo/textfile.txt' into table penguin
fields terminated by '\t' escaped by '\b'
lines terminated by '\n' (@col1, @col2) set id=@col1,
chucknorris=@col2;
Query OK, 5 rows affected (0.00 sec)
Records: 5 Deleted: 0 Skipped: 0 Warnings: 0
ステップ 9、テーブルから選択し、結果を解釈します。
mysql> select * from penguin;
+----+------------------------------------------------------------------+
| id | chucknorris |
+----+------------------------------------------------------------------+
| 1 | aliens are on route |
| 2 | scramble the nimitz\ |
| 3 | \its species 8472 |
| 4 | \\\\\\\\\\\\\\\\\\ |
| 5 | Bonus characters:!@#$%^&*()_+=-[]\|}{;'":/.?>,< anything but tab |
+----+------------------------------------------------------------------+
5 rows in set (0.00 sec)
そして今、すべてが期待どおりです。2 行目の最後のバックスラッシュは、改行をエスケープしません。行 3の前のバックスラッシュi
は何もしません。行 4 の 18 個のバックスラッシュはエスケープされません。そして、ボーナスキャラクターは大丈夫です。