mysqlロードデータファイルツールでバックスラッシュとすべての制御文字を処理します。
ステップ1、テーブルを作成します。
mysql> create table penguin (id int primary key, chucknorris VARCHAR(4000));
Query OK, 0 rows affected (0.01 sec)
ステップ2、インポートするファイルを作成し、そこにこのデータを配置します。
1 spacealiens 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 | spacealiens 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にスクランブルします。
行3の残りの部分は、余分な単語its species 8472
がどこにも収まらないためスキップされ、上記の警告が表示されます。
行4には18個のバックスラッシュがあったため、問題はなく、それぞれがエスケープされたため、9個のバックスラッシュとして表示されます。奇数があった場合、行2のエラーは行4で発生します。
5列目のボーナスキャラクターは正常に通過しました。タブ以外はすべて許可されます。
ステップ7、テーブルペンギンをリセットします。
mysql> delete from penguin;
fields escaped by
ステップ8、次の句を使用してテーブルにロードします。
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 | spacealiens 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個の円記号はエスケープされません。そして、ボーナスキャラクターは大丈夫です。