在 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('%', "@%");
}
我在 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('%', "@%");
}