有什么方法可以在 SQLite 中执行不区分重音的 LIKE 查询吗?例如,这个查询:
SELECT * FROM users WHERE name LIKE "Andre%"
会返回:
巨人安德烈 安德烈·阿加西 ETC。
如果有什么区别的话,我正在使用 Qt 和 QSqlDatabase。
您可以创建自定义排序函数来删除字符串中的重音符号
这里我使用Javascript中的sqlite3库为例
npm install sqlite3
const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database(':memory:'); // or 'example.db' for a file-based database
function removeAccents(str) {
return str.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
}
function noAccentsCollation(a, b) {
const aNorm = removeAccents(a);
const bNorm = removeAccents(b);
if (aNorm < bNorm) return -1;
if (aNorm > bNorm) return 1;
return 0;
}
db.serialize(() => {
// Register the collation
db.run("SELECT load_extension('mod_spatialite')"); // Ensure extensions are enabled
db.run("SELECT sqlite3_create_collation('NOACCENTS', noAccentsCollation)");
// Create a sample table
db.run(`
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT
)
`);
// Insert sample data
const stmt = db.prepare("INSERT INTO users (name) VALUES (?)");
stmt.run('André the Giant');
stmt.run('Andre Agassi');
stmt.finalize();
// Perform the accent-insensitive LIKE query
db.all("SELECT * FROM users WHERE name LIKE 'Andre%' COLLATE NOACCENTS", (err, rows) => {
if (err) {
console.error(err);
return;
}
rows.forEach(row => {
console.log(row);
});
});
});
db.close();