我在 Python3 中创建了这个 NOACCENT COLLATION,以便在我正在尝试编写的 sqlite 数据库程序中使用它。
我的目标是使带重音的人声搜索不敏感,并使数据输入对重音也不敏感,这样(即)如果该表字段中已经存在“Gonzalez”值,则不会承认“Gonzalez”值。
我所做的对第二部分(限制值)和完整的值搜索很有效。我无法使它适用于 SELECT ... LIKE 表达式。我知道 SQLite 中 COLLATE NOCASE 对 az, AZ 中的 unicode 字符的 LIKE 限制,但是为什么当我使用自己定义的排序规则 NOACCENT 时该限制适用?因为看起来就是这样。
例子:
cur.execute(""" CREATE TABLE Demo(
Id INTEGER PRIMARY KEY,
Nombre TEXT COLLATE NOACCENT UNIQUE)""")
cur.execute("INSERT INTO Demo(Nombre) VALUES ('álberto')")
cur.execute("INSERT INTO Demo(Nombre) VALUES ('alberta')")
cur.execute("INSERT INTO Demo(Nombre) VALUES ('Álbertu')")
cur.execute("INSERT INTO Demo(Nombre) VALUES ('Álberte')")
cur.execute("INSERT INTO Demo(Nombre) VALUES ('Albertczo')")
cur.execute("INSERT INTO Demo(Nombre) VALUES ('albertai')")
如果我做:
cur.execute("SELECT * FROM Demo WHERE Nombre='ALBERTO' COLLATE NOACCENT")
我得到:
(1, 'álberto)
什么好。这适用于大写和小写的任何组合以及单词的任何声音中的任何重音('ALBERTÓ','Älbèrtô'......)
如果我尝试插入值“ALBERTÓ”,由于唯一约束,我会收到一个错误,所以这很好用。
问题是当我尝试使用 LIKE 表达式时:
cur.execute("SELECT * FROM Demo WHERE Nombre LIKE 'ALBERT%' COLLATE NOACCENT")
返回:
(2, 'alberta')
(5, 'Albertczo')
(6, 'albertai')
没有重音的值。
数据库本身是否有任何解决方案,或者我必须通过软件进行部分搜索(即“阿尔伯特”)。
希望我的问题足够清楚。
提前致谢。
def noaccent(string): # eliminate accented vocals
vocals = ['a', 'e', 'i', 'o', 'u'] * 4
acc_vocals = ['á', 'é', 'í', 'ó', 'ú','à', 'è', 'ì', 'ò', 'ù', 'ä', 'ë', 'ï', 'ö', 'ü', 'â', 'ê', 'î', 'ô', 'û']
no_acc = string
for letter in acc_vocals:
no_acc = no_acc.replace(letter, vocals[acc_vocals.index(letter)])
return no_acc
def collate_noaccent(string1, string2):
str1 = noaccent(string1.lower())
str2 = noaccent(string2.lower())
if str1 < str2:
return -1
elif str1 > str2:
return 1
else:
return 0