我尝试使用以下命令编辑wordpress mysql数据库:
root@vps:~# echo "UPDATE `wp_options` SET `option_value` = 'hello world' WHERE `option_id` =3" | mysql -u root -D dbname;
-bash: wp_options: command not found
-bash: option_value: command not found
-bash: option_id: command not found
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SET = 'hello world' WHERE =3' at line 1
mysql --version
root@vps:~# mysql --version
mysql Ver 15.1 Distrib 10.1.28-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
非常感谢你的帮助。
答案 0 :(得分:1)
尝试一些试验和错误后,我得到答案
root@vps:~# echo "UPDATE wp_options SET option_value = 'hello world' WHERE option_id =3" | mysql -u root -D dbname;
答案 1 :(得分:1)
问题出现在第一个shell命令中,您可以从bash
报告的错误中看到:
echo "UPDATE `wp_options` SET `option_value` = 'hello world' WHERE `option_id` =3"
在运行命令之前,shell(bash
)在命令行上执行多次替换。其中一个是command substitution(上面命令中唯一的替换类型)。此替换标识由反引号(`
)包围的子串,将它们作为单独的命令运行,并用它们的输出替换它们。
在您的情况下,bash
发现wp_options
,option_value
和option_id
被`
包围,尝试将其作为命令运行并失败,因为它们不是Linux命令。然后用运行这些命令生成的输出替换它们(没有输出,因为它们没有运行),命令变为:
echo "UPDATE SET = 'hello world' WHERE =3" | mysql
当然,这不是有效的查询,mysql
也会抱怨。
此问题的简单解决方案是将查询包装成单引号('
); bash
对单引号中包含的参数不执行command substitution。在这种情况下,您需要在查询内的字符串值周围使用双引号。
命令应为:
echo 'UPDATE `wp_options` SET `option_value` = "hello world" WHERE `option_id` = 3' | mysql -u root -D dbname
另一个选择是不将表和字段名称包装在查询中的反引号中。它们不是MySQL关键字,它们不包含特殊字符,不需要将它们放在反引号中。在这种情况下,您可以使用双引号进行查询,因为它现在不包含任何特殊内容:
echo "UPDATE wp_options SET option_value = 'hello world' WHERE option_id = 3" | mysql -u root -D dbname
答案 2 :(得分:-1)
UPDATE希望您命名一个表,而不是表的一个字段,因此它将是dbname.wp_options
而不是dbname.wp_options.option_id
echo UPDATE `dbname`.`wp_options` SET `option_value` = 'hello world' WHERE `wp_options`.`option_id` =3 | mysql -u root
我个人更喜欢使用UPDATE wp_options
并告诉mysql客户端使用mysql -D dbname
连接哪个数据库。