命令行执行MySQL UpdateXML失败但控制台运行正常问题排查
报错原因
核心是Bash的引号预解析规则导致SQL中的XPATH表达式被错误转义:
你在Bash中用双引号包裹-e参数后的整段SQL时,SQL内部的\"会被Bash优先解析为普通双引号,最终传递给MySQL的XPATH表达式的属性值引号会和SQL外层的引号边界混淆,导致search_property两端的引号丢失,被MySQL识别为节点名而非字符串常量,触发「两个节点集对比不支持」的报错。
而直接在MySQL控制台执行时,没有Bash的提前转义步骤,转义双引号会被MySQL正确识别为XPATH属性值的边界,因此执行正常。
解决方案
方案1:用单引号包裹整段SQL(最简单)
Bash中单引号内部的内容会原样传递,无需额外处理内部的双引号转义,仅需要把SQL中原有字符串值的单引号替换为双引号即可,示例:
mysql -uadmin -p**** -h127.0.0.1 db -e 'UPDATE my_table set my_field = updatexml(my_field, "/config/properties/property[@name=\"search_property\"]", "<property name=\"search_property\" value=\"new_property_value\" />") where name="my_xml_record";'
方案2:修改XPATH属性值的引号为单引号,避免冲突
XPATH语法本身支持属性值用单引号包裹,修改后不需要处理复杂的转义规则即可在双引号包裹的SQL中正常使用,示例:
mysql -uadmin -p**** -h127.0.0.1 db -e "UPDATE my_table set my_field = updatexml(my_field, \"/config/properties/property[@name='search_property']\", \"<property name='search_property' value='new_property_value' />\") where name='my_xml_record';"
方案3:SQL写入独立文件执行
如果SQL逻辑比较复杂,建议直接把SQL写入单独的文件,完全避开Bash的引号解析问题:
- 新建
update_xml.sql文件,写入SQL内容:
UPDATE my_table set my_field = updatexml(my_field, '/config/properties/property[@name="search_property"]', '<property name="search_property" value="new_property_value" />') where name='my_xml_record';
- 执行命令导入执行:
mysql -uadmin -p**** -h127.0.0.1 db < update_xml.sql
内容的提问来源于stack exchange,提问作者user2197828
相关产品推荐
相关产品推荐

