将文件内容加载到表的特定单元格中

时间:2012-01-12 20:13:49

标签: mysql

  

可能重复:
  Insert file contents into MySQL table's column

我想将文件的内容加载到表的特定单元格中,或者更确切地说我想要更新特定的单元格,更新后的单元格内容应该是文件的内容。

优选地通过命令行。我的第一次尝试说明了我想要实现的目标;

mysql -p -u user -e "update my_table set body='`cat filename`' where id=x;" dbname

但是当然mysql在文件中的特殊字符有问题。或者我会同意perl one-liner。

1 个答案:

答案 0 :(得分:1)

您可以使用Charles Sprayberry上面链接问题答案中给出的LOAD_FILE函数。这看起来像这样:

mysql -p -u user -e "update my_table set body=load_file('/path/to/filename') where id=x;" dbname

如果这对您不起作用(例如,由于权限问题或诸如此类),那么您可以通过使用Bash和sed的功能来修复现有命令,从而以不同方式解决您的问题,如下所示:

在单引号字符串中,大多数特殊字符(例如换行符和诸如此类的东西)似乎都很好。应该是问题的唯一字符是'(将被解释为终止字符串)和\(将被解释为引入转义序列),并且这两个字符都可以通过前缀\(例如,'\'''\\'是字符串文字,分别表示'\。此sed脚本会在任何\'之前插入\

s/\('\|\\\)/\\\1/g

你可以像这样从Bash调用:

sed 's/\('"'"'\|\\\)/\\\1/g' filename

(例如,如果filename包含此内容:

a \ b \ c
d ' e ' f

然后sed 's/\('"'"'\|\\\)/\\\1/g' filename会打印出来:

a \\ b \\ c
d \' e \' f

)。但是你不能只在`...`中包含上面的内容,因为这些字符对于Bash也是特殊的,它会变得混乱。 (我假设你正在使用Bash?)相反,你需要使用$(...),这是一个等同于`...`的Bash符号,除了它更好地处理这样的各种细节。 (我建议始终使用$(...)而不是`...`。)所以你的总体命令是:

mysql -p -u user -e "update my_table set body='$(sed 's/\('"'"'\|\\\)/\\\1/g' filename)' where id=x;" dbname
相关问题