SQLite soundex() 函数使用指南
SQLite soundex() 是一个内置的字符串处理函数,它实现了经典的 Soundex 语音哈希算法。该算法能够将发音相似的英文字符串映射为相同的四字符编码(一个英文字母加三位数字),主要用于解决英文拼写不统一、打字录入微小错误或基于发音的模糊姓名匹配问题。
在客户关系管理系统(CRM)、人员档案库以及全文字典搜索场景中,用户的输入往往存在拼写误差(例如 “Smith” 与 “Smyth”)。使用 soundex() 函数可以快速在 SQL 查询中根据发音聚类,提高数据检索的容错能力。
SQLite soundex() 语法
这里是 SQLite soundex() 函数的标准语法:
soundex(string)
参数
string- 必需的。需要计算 Soundex 语音编码的目标英文字符串。若传入非字符串类型,SQLite 会在计算前隐式将其转换为文本。
返回值
SQLite soundex() 函数返回一个由大写字母和三位数字组成的 4 字符文本(例如 'S530'):
- 编码规则保留首个有效英文字母,随后根据辅音发音群(如 B, F, P, V 编码为 1;C, G, J, K, Q, S, X, Z 编码为 2 等)转换为数字,省略元音(A, E, I, O, U, Y, H, W),并在末尾补零以确保长度为 4。
- 如果参数为
NULL,该函数返回NULL。 - 如果传入的字符串不包含任何英文字母,通常返回
'?000'。
[!NOTE] 在某些精简编译的 SQLite 发行版中,
soundex()属于可选特性。默认编译开关需启用-DSQLITE_SOUNDEX宏支持。
SQLite soundex() 示例
这里提供多个展示 SQLite soundex() 实际应用场景的示例。
比较不同拼写的同音单词
通过计算发音相同但拼写不同的两个姓名,观察返回的编码:
SELECT
soundex('Smith') AS soundex_smith,
soundex('Smyth') AS soundex_smyth,
soundex('Robert') AS soundex_robert,
soundex('Rupert') AS soundex_rupert;
输出:
soundex_smith soundex_smyth soundex_robert soundex_rupert
------------- ------------- -------------- --------------
S530 S530 R163 R163 可以看到,‘Smith’ 和 ‘Smyth’ 映射为相同的编码 S530,‘Robert’ 和 ‘Rupert’ 映射为 R163。
在查询中实现姓名容错过滤
假设有一个客户联系人表 customers,用户在搜索框中误将 “Stephen” 拼写为 “Steven”:
CREATE TABLE customers (
id INTEGER PRIMARY KEY,
full_name TEXT NOT NULL
);
INSERT INTO customers (id, full_name) VALUES
(1, 'Stephen Curry'),
(2, 'Michael Jordan'),
(3, 'Steven Adams');
-- 检索发音匹配 'Steven' 的所有人
SELECT id, full_name
FROM customers
WHERE soundex(full_name) = soundex('Steven');
输出:
id full_name
-- -------------
1 Stephen Curry
3 Steven Adams NULL 值与非字母字符串测试
SELECT
soundex(NULL) AS res_null,
soundex('12345') AS res_num,
soundex('') AS res_empty;
输出:
res_null res_num res_empty
-------- ------- ---------
NULL ?000 ?000 结论
soundex()适合处理欧美常见姓名的同音异形检索。- 该算法仅基于标准英语语音规则设计,对于汉语拼音、非拉丁文字(如中文汉字、日文假名)或复杂的复合专有名词效果有限。
- 在大数据量表上针对
soundex(column)频繁过滤时,建议创建基于表达式的索引(CREATE INDEX idx_name_soundex ON customers(soundex(full_name)))以避免全表顺序扫描。