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

Escape % (percent) in QSqlQuery::addBindValue() for LIKE

我在 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\%%");,但它根本没有输出任何东西。

LIKE 模式匹配在与参数绑定不同的级别上工作。

要转义“%”或“_”字符,您必须使用 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('%', "@%");
}