SQLite 不区分重音的搜索

问题描述 投票:0回答:2

有什么方法可以在 SQLite 中执行不区分重音的 LIKE 查询吗?例如,这个查询:

SELECT * FROM users WHERE name LIKE "Andre%"

会返回:

巨人安德烈
安德烈·阿加西
ETC。

如果有什么区别的话,我正在使用 Qt 和 QSqlDatabase。

sqlite qt diacritics sql-like accent-insensitive
2个回答
1
投票

使用 sqlite3_create_collation

 设置
排序规则,然后像这样使用它:

SELECT * FROM users WHERE name LIKE "Andre%" COLLATE NOACCENTS

0
投票

您可以创建自定义排序函数来删除字符串中的重音符号

这里我使用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();
© www.soinside.com 2019 - 2024. All rights reserved.