MySQL将制表符分隔的文件加载到具有特殊字符的表中

MySQL将制表符分隔的文件加载到具有特殊字符的表中,mysql,sql,Mysql,Sql,我希望能够将一个文件加载到一个MySQL表中,该表中有反斜杠,如下所示: Fred Los Angeles I am Fred Nick Madison Great Lakes Whoo JOHN San Diego Hello world!\ Bob NYC Big apple 用户JOHN在第3列的末尾放了一个

我希望能够将一个文件加载到一个MySQL表中,该表中有反斜杠,如下所示:

Fred          Los Angeles        I am Fred
Nick          Madison            Great Lakes Whoo
JOHN          San Diego          Hello world!\
Bob           NYC                Big apple            
用户JOHN在第3列的末尾放了一个\。当我将其加载到表中时,MySQL将反斜杠解释为某种行延续,并将第3行Col 3与第4行Col1连接起来

我不能只是复制粘贴来修复它,因为像这样的行有数百万行,在不同的地方有反斜杠,造成了巨大的破坏

使用反斜杠将制表符分隔的文件加载到MySQL表中的正确方法是什么?我应该用引号括住每个列字段吗?我应该编写一个删除特殊字符的解析器吗?

加载文件时,必须指定转义符选项。在以下示例中,我假设您的字段被默认行为的tab分隔,并且文件位于客户端主机上:

LOAD DATA LOCAL INFILE '/path/to/file/my.txt' INTO TABLE t
FIELDS TERMINATED BY '\t' ESCAPED BY '\b';
如何在mysql加载数据填充工具中驯服反斜杠: 步骤1,创建表格:

第2步,创建要导入的文件并将这些数据放入其中

步骤4,当然,它会导致这种奇怪的输出:

第六步,想想到底哪里出了问题:

nimitz左边的反斜杠导致mysql加载数据解析器将第2行的末尾与第3行的开头连接起来。然后它撞到了一个标签,将“扰乱尼米兹”\n3放入第2行

第3行的其余部分被跳过,因为它的种类8472的额外单词不适合任何地方,它会产生您在上面看到的警告

第4行有18个反斜杠,所以没有问题,显示为9个反斜杠,因为每个反斜杠都已转义。如果有一个奇数,第2行的错误将发生在第4行

第5行的奖金字符正常通过。除了标签,什么都可以

第7步,重置企鹅:

步骤8,使用子句转义的字段加载到表中:

步骤9,从表格中选择,解释结果:


现在一切都如我们所料。第2行末尾的反斜杠不转义换行符。第3行我前面的反斜杠没有任何作用。第4行上的18个反斜杠没有转义。并且额外的字符通过了ok。

我将编写一个解析器来处理特殊字符。如果数据带有引号,则将字段括在引号中可能不起作用。
mysql> create table penguin (id int primary key, chucknorris VARCHAR(4000));
Query OK, 0 rows affected (0.01 sec)
1   aliens are on route
2   scramble the nimitz\
3   \its species 8472
4   \\\\\\\\\\\\\\\\\\
5   Bonus characters:!@#$%^&*()_+=-[]\|}{;'":/.?>,< anything but tab
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
mysql> select * from penguin;
+----+-----------------------------------------------------------------+
| id | chucknorris                                                     |
+----+-----------------------------------------------------------------+
|  1 | aliens are on route                                             |
|  2 | scramble the nimitz
3                                           |
|  4 | \\\\\\\\\                                                       |
|  5 | Bonus characters:!@#$%^&*()_+=-[]|}{;'":/.?>,< anything but tab |
+----+-----------------------------------------------------------------+
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)
mysql> delete from penguin;
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
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)