我想将文件的内容加载到表的特定单元格中,或者更确切地说我想要更新特定的单元格,更新后的单元格内容应该是文件的内容。
优选地通过命令行。我的第一次尝试说明了我想要实现的目标;
mysql -p -u user -e "update my_table set body='`cat filename`' where id=x;" dbname
但是当然mysql在文件中的特殊字符有问题。或者我会同意perl one-liner。
答案 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