在LIKE的QSqlQuery :: addBindValue()中转义%(百分比)

时间:2015-03-23 15:22:23

标签: c++ sql qt sqlite qsqlquery

我在Qt中使用SQLite数据库。我将值绑定到查询,而不是在查询字符串中传递它们。但是,我无法弄清楚如何正确地转义绑定值本身的%(百分比)。

例如,如何更改此代码,使其输出va%ue1,而不是value1

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
db.open();
QSqlQuery q(db);
q.exec("CREATE TABLE test (field1)");
q.exec("INSERT INTO test VALUES (\"value1\")");
q.exec("INSERT INTO test VALUES (\"va%ue1\")");
q.prepare("SELECT field1 FROM test WHERE field1 LIKE ?");
q.addBindValue("va%%%");
q.exec();
while (q.next()) {
    qDebug() << q.value(0);
}

现在输出两个:

QVariant(QString, "value1") 
QVariant(QString, "va%ue1") 

我也试过了q.addBindValue("va\\%%");,但它根本没有输出任何东西。

1 个答案:

答案 0 :(得分:2)

LIKE模式匹配与参数绑定不同。

逃避&#39;%&#39;或者&#39; _&#39;字符,您必须使用ESCAPE clause

q.prepare("SELECT field1 FROM test WHERE field1 LIKE ? ESCAPE '@'");
q.addBindValue("va@%%");

这是一个逃避任何绑定值的函数:

QString sqlEscape(QString boundValue)
{
    boundValue.replace('@', "@@");
    boundValue.replace('_', "@_");
    boundValue.replace('%', "@%");
}