如何通过MySQL命令行存储图片?bash脚本报错求助
解决bash脚本通过MySQL CLI存储图片到数据库的问题
问题根源
二进制图片数据中包含的特殊字符(如反斜杠、引号、控制字符)会直接破坏SQL语句的语法结构,导致MySQL解析时出现类似Unknown command '\l'的错误。直接将图片内容读入bash变量再拼接进SQL的方式无法处理这些特殊字符的转义。
解决方案
- 改用MySQL的
LOAD_FILE()函数:让MySQL直接读取临时生成的缩略图文件,避免将二进制数据传入bash变量,从根源上解决转义问题。 - 修复SQL语法错误:原SQL中
Thumb字段行末尾遗漏了逗号,这也是潜在的语法问题。
修改后的脚本片段
… # Store a thumbnail of the image file, together with path and image name. tmp="/tmp/$1" /usr/local/bin/magick \ "$1" \ -thumbnail 256x256 \ -unsharp 1.5x1+0.7+0.02 \ "${tmp}" fullpath=$(realpath "$1") dirpath=$(dirname "${fullpath}") basename=$(basename "${fullpath}") # 调整SQL语句,用LOAD_FILE读取临时文件,同时修复逗号缺失问题 sql="INSERT INTO Bird_Images SET \ \`Master_Guide\` = \"${handle}\", \ \`Thumb\` = LOAD_FILE('${tmp}'), \ \`Path\` = \"${dirpath}\", \ \`Filename\` = \"${basename}\"" echo $fullpath echo $dirpath echo $basename #echo $sql /usr/local/bin/mysql \ --user=GPS_User \ --password=ReSu_SpG \ --host=localhost \ --database=Personal \ --execute="${sql}"
额外注意事项
- 确认MySQL的
secure_file_priv系统变量允许读取/tmp目录:执行SHOW VARIABLES LIKE 'secure_file_priv';查询,若值为/tmp或空则符合要求;若为指定目录,需将临时缩略图文件放到该目录下。 - 临时文件
${tmp}的权限需确保MySQL进程可读取,/tmp目录默认权限为777,一般无需额外设置。 - 建议用
$()替代反引号执行命令,bash中该写法更易读,嵌套场景下更稳定。
内容的提问来源于stack exchange,提问作者Jan Steinman
相关产品推荐
相关产品推荐

