QSqlQuery 绑定值与 BindValues 与 QString.arg() 是否存在性能差异
QSqlQuery binding values with BindValues vs QString.arg() is there a performance difference?
BindValue
和QString.arg()
数据库之间有区别吗?
QString().arg()
:
QSqlQuery qry;
qry.prepare(QString("INSERT INTO employee (id, name, salary) VALUES (%1, 'Thad Beaumont', %2)").arg(1001).arg(65000));
qry.exec();
QSqlQuery::bindValue
:
QSqlQuery query;
query.prepare("INSERT INTO employee (id, name, salary) VALUES (:id, :name,:salary)");
query.bindValue(":id", 1001);
query.bindValue(":name", "Thad Beaumont");
query.bindValue(":salary", 65000);
query.exec();
它们之间有什么性能差异吗?BindValues
优于其他方法吗?
根据维基百科,使用预准备语句有两个优点,即性能和抵御SQL注入攻击的弹性。
有很多帖子详细解释了有关特定SQL引擎(MySQL,PostgreSQL(的事情,并且由于您的问题被标记为SQLite,因此有一个关于预准备语句在SQLite中性能的详细SO问题。所有这些帖子似乎都同意,准备好的语句比手动执行语句更有效(除了它们的安全优势(。
除了数据库更高效之外,您的代码也更有效。也就是说,在使用预准备语句时,您不必为替换查询字符串中的值的字符串操作付费,而是将所有字符串按原样传输到数据库而不连接,数据库负责执行它们。
我认为你和你的同事把准备好的陈述弄错了。例如,使用它们最著名的目的之一是(尝试(避免SQL注入,这就是为什么无论性能问题如何,都应该始终使用参数并绑定它们。在这种情况下,使用 arg
是没有意义的:它不是参数绑定的替代品,您只是在构建一个 SQL 字符串。如果您 100% 确定参数被很好地过滤/转义/检查,并且使用 exec 执行它,则可以使用它,没有理由使用预准备语句。
QSqlQuery::bindValue()
更好。
由于QString不记录%x
的位置,
QString("INSERT INTO employee (id, name, salary) VALUES (%1, 'Thad Beaumont', %2)").arg(1001).arg(65000)
,它必须计算每次调用时将参数放在哪里。
另一方面,当调用QSqlQuery::prepare()
时,它会记录位置
此外,QSqlQuery::bindValue()
对我来说很好,我不再担心'
了。
query.bindValue(":name", "Thad's Beaumont")
现在,您可以安全地存储带有 '
的名称。(在此之前,我有时会用''
替换它,有时为了性能,我会用一些很少使用的角色替换它,例如0x000c
(。
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 有了gcc,是否可以链接库,但前提是它存在
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 如何检查QList中是否存在值
- 根据某个函数是否存在启用模板
- 地图计数确实很重要,或者只是检查是否存在
- C++中是否存在 std::conditional 的懒惰等价物?
- 无论如何,我可以确定构造函数是否存在吗?
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 堆分配的对象是否存在永不为空的唯一所有者?
- 扩展类中的可选 vir 函数,测试它在运行时是否存在
- 模板化检查是否存在带有参数列表的类成员函数?
- 是否存在包含负号的isdigit函数(过载)
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 检查编译时是否存在静态函数
- 向量是否存在行主要形式?
- 检查 TinyXML 中的元素是否存在
- 检测是否存在具有 C++17 的类成员
- 虚拟继承中是否存在多重继承?
- 我遇到了这个代码片段,不明白. 它递归检查 C++ 字符串中是否存在大写字符