Mysql 转义具有节点的准备语句中的数据库名称
我正在尝试使用库请求我的数据库 我需要使用查询占位符的语法,因此我尝试了一个简单的请求:Mysql 转义具有节点的准备语句中的数据库名称,mysql,node.js,Mysql,Node.js,我正在尝试使用库请求我的数据库 我需要使用查询占位符的语法,因此我尝试了一个简单的请求: connection.query('DROP DATABASE IF EXISTS?;',['mydb']) 但这导致: “您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解第1行“mydb”附近使用的正确语法。 问题确实是: 'DROP DATABASE IF EXISTS'mydb\';' 那么这实际上应该如何工作呢?MySQL表示法是: DROP DATABASE IF EXISTS
connection.query('DROP DATABASE IF EXISTS?;',['mydb'])代码>
但这导致:
“您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解第1行“mydb”附近使用的正确语法。
问题确实是:
'DROP DATABASE IF EXISTS'mydb\';'代码>
那么这实际上应该如何工作呢?MySQL表示法是:
DROP DATABASE IF EXISTS `mydb`
因为您将其作为字符串转义,所以它不能删除数据库引用
某些驱动程序支持备用占位符的原因如下:
DROP DATABASE IF EXISTS ??
通常不能对数据库、列或表等对象使用占位符值,因为它们的处理方式不同。这是驾驶员的限制
您只需要注意用户提供的值和名称中包含不规则字符。需要根据进行转义。尝试将['mydb']更改为“my\u db\u name”。比如conncection.query('statement','my_db_name');第二个选项:connection.query('DROP DATABASE IF EXISTS(?);',['mydb']);您可能无法将占位符值用于数据库名称之类的内容。这些不是字符串。@NikolayVetrov尝试了这两种方法,但都不起作用。@tadman我想这是真的。尝试另一种方法:connection.query('DROP DATABASE IF EXISTS'+connection.escape(db_name));好的,我并不介意数据库名称,但是对于列和表,我应该做什么呢?这取决于MySQL驱动程序的功能。大多数不能作为占位符来执行,因此您需要手动执行,或者使用驱动程序函数(如果有)。类似于x=>connection.escape(x)。replace(/^'(.*)$/,“$1”)
?例如,支持将?
作为标识符的准备语句占位符。其他人则使用不同的符号。这里的想法是符合MySQL的标识符转义,如答案中所链接的。因为如果我删除引号,我确实会得到DROP DATABASE if EXISTS mydb
,这是正确的。。。但我可能会用反勾来代替它