首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL将以制表符分隔的文件加载到包含特殊字符的表中

问MySQL将以制表符分隔的文件加载到包含特殊字符的表中
EN

Stack Overflow用户
提问于 2013-03-21 08:13:02
回答 2查看 15K关注 0票数 7

我希望能够将文件加载到其中包含反斜杠的MySQL表中,如下所示:

代码语言:javascript
复制
Fred          Los Angeles        I am Fred
Nick          Madison            Great Lakes Whoo
JOHN          San Diego          Hello world!\
Bob           NYC                Big apple            

用户JOHN在第3列的末尾放置了一个\。当我将其加载到表中时,MySQL将反斜杠解释为某种行续接符,并将第3行,第3列)与(第4行,第Col1行)连接起来。

我不能简单地复制和粘贴来修复它,因为有数百万行像这样在不同的地方使用反斜杠造成严重破坏。

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

EN

回答 2

Stack Overflow用户

发布于 2013-03-21 10:14:40

加载文件时必须指定ESCAPED BY选项。在下面的示例中,我假设您的字段按选项卡划分(这是默认行为),并且文件位于客户端主机上:

代码语言:javascript
复制
LOAD DATA LOCAL INFILE '/path/to/file/my.txt' INTO TABLE t
FIELDS TERMINATED BY '\t' ESCAPED BY '\b';
票数 7
EN

Stack Overflow用户

发布于 2014-01-17 12:52:55

如何在mysql加载数据加密工具中驯服反斜杠:

第1步,创建表:

代码语言:javascript
复制
mysql> create table penguin (id int primary key, chucknorris VARCHAR(4000));
Query OK, 0 rows affected (0.01 sec)

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

代码语言:javascript
复制
1   aliens are on route
2   scramble the nimitz\
3   \its species 8472
4   \\\\\\\\\\\\\\\\\\
5   Bonus characters:!@#$%^&*()_+=-[]\|}{;'":/.?>,< anything but tab

第3步,插入到表中:

代码语言:javascript
复制
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,当然,它会导致这个奇怪的输出:

代码语言:javascript
复制
mysql> select * from penguin;
+----+-----------------------------------------------------------------+
| id | chucknorris                                                     |
+----+-----------------------------------------------------------------+
|  1 | aliens are on route                                             |
|  2 | scramble the nimitz
3                                           |
|  4 | \\\\\\\\\                                                       |
|  5 | Bonus characters:!@#$%^&*()_+=-[]|}{;'":/.?>,< anything but tab |
+----+-----------------------------------------------------------------+

第5步,分析警告:

代码语言:javascript
复制
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 load data解析器将第2行的末尾与第3行的开头连接起来。然后,它撞上了一个制表符,并将'scramble The nimitz\n3‘放入了第2行。

第3行的其余部分被跳过,因为多余的单词its species 8472不适合任何地方,它会生成上面看到的警告。

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

第5行的奖励字符正常通过。除了制表符之外,所有内容都是允许的。

步骤7,重置企鹅:

代码语言:javascript
复制
mysql> delete from penguin;

在第8步中,使用fields escaped by 子句装载到表中:

代码语言:javascript
复制
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步,从您的表中选择,解释结果:

代码语言:javascript
复制
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个反斜杠不进行转义。而奖励字符通过了ok。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15537199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档