无法使用加载数据infile识别错误原因

时间:2016-07-07 09:00:16

标签: mysql sql

我将数据加载到存储过程内的表中,该存储过程的文件名作为参数传递。

 select @load_config:= concat('load data local infile ',config_file,' into table config fields terminated by \',\' lines terminated by \n');
 prepare stm from @load_config;

为此我收到错误

  

错误1064(42000):您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以便在'/mnt/appln/mysql/dvdbuser/config.csv附近使用正确的语法到由',''在第1行终止的表配置字段   我也试过这个

 select @load_config:= concat('load data local infile \'',config_file,'\' into table config fields terminated by \',\' lines terminated by \n');
 prepare stm from @load_config;

我得到了错误

  

错误1064(42000):您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以便在第1行的''附近使用正确的语法

说实话,我迷路了,我不知道我在哪里搞砸了

2 个答案:

答案 0 :(得分:1)

您应该使用SET为变量赋值:

SET @load_config:= concat('load data local infile ',config_file,' into table config
    fields terminated by \',\' lines terminated by \n');

答案 1 :(得分:1)

\是转义序列的开始。

第一个问题很可能是缺少单引号。因此,当您执行\'时,它会转换为单引号,从而终止未关闭的块。由于它现在已关闭,因为保留了字符串片段而导致语法错误。你需要做\\',这会带来斜线,而不是之后的单引号。

请参阅Mysql手册页,了解String Literals处的转义序列表。

即使如此,整件事也行不通。因为存储过程,事件等不支持LOAD DATA INFILE。这是一件令人伤心的事,但据称是出于安全原因。它会产生42000或类似的错误。

  

错误:预准备语句中不支持此命令   协议

一种解决方法是使用UDF,它需要你修改你的mysql环境,或为我这样做的琐碎事情创建一个外部进程。