有没有办法使用 Django 和 MariaDB 执行不区分重音的查找?
Is there a way to perform accent-insensitive lookups using Django and MariaDB?
我想在法语数据库中进行不区分重音的查找(单词包含重音):
>>> User.objects.filter(first_name="Jeremy")
['<User: Jéremy>', '<User: Jérémy>', '<User: Jeremy>']
经过大量研究,我发现 Django 有一个 Unaccent 对 PostgreSQL 的查找,但没有对其他数据库(如 MariaDB)
有没有办法在不将数据库更改为 PostgreSQL 的情况下实现这一目标?
终于解决了:
所以首要的是:熟悉 SQL 归类! (感谢@MartinBurch)
排序规则设置搜索规则,以便 SQL 可以匹配您给定的关键字。
经过大量的头脑风暴,我是这样解决的:
1- 前往您的“my.cnf”文件
(如果你知道你的 my.cnf 在哪里,你可以跳到第 5 步)
2- 打开您的终端并输入:
$ which mysqld
应该 return“/usr/sbin/mysqld”或其他路径,具体取决于您的配置。
3- 使用步骤2中returned的路径如下:
$ /your/path/to/mysqld --verbose --help | grep -A 1 "Default options"
那应该 return 像这样结束的东西:
Default options are read from the following files in the given order:
/etc/mysql/my.cnf ~/.my.cnf /usr/etc/my.cnf
4- 找到包含 [mysqld] 部分的文件。如果其中 none 个有,请添加它。
注意:写段名很重要SQL否则无法启动
5- 在文件末尾添加以下行并保存:
[mysqld]
character_set_server = latin1
collation-server = latin1_general_ci
6- 重新启动您的 MariaDB 服务器(如果您有 brew 版本):
brew services stop mariadb
brew services start mariadb
7- 前往您的 Django 项目并使用“__icontains”进行不区分大小写和重音的查询:
User.objects.filter(name__icontains=jeremy)
>>> ['<User: Jéremy>', '<User: Jérémy>', '<User: Jeremy>']
我想在法语数据库中进行不区分重音的查找(单词包含重音):
>>> User.objects.filter(first_name="Jeremy")
['<User: Jéremy>', '<User: Jérémy>', '<User: Jeremy>']
经过大量研究,我发现 Django 有一个 Unaccent 对 PostgreSQL 的查找,但没有对其他数据库(如 MariaDB)
有没有办法在不将数据库更改为 PostgreSQL 的情况下实现这一目标?
终于解决了:
所以首要的是:熟悉 SQL 归类! (感谢@MartinBurch) 排序规则设置搜索规则,以便 SQL 可以匹配您给定的关键字。
经过大量的头脑风暴,我是这样解决的:
1- 前往您的“my.cnf”文件 (如果你知道你的 my.cnf 在哪里,你可以跳到第 5 步)
2- 打开您的终端并输入:
$ which mysqld
应该 return“/usr/sbin/mysqld”或其他路径,具体取决于您的配置。
3- 使用步骤2中returned的路径如下:
$ /your/path/to/mysqld --verbose --help | grep -A 1 "Default options"
那应该 return 像这样结束的东西:
Default options are read from the following files in the given order:
/etc/mysql/my.cnf ~/.my.cnf /usr/etc/my.cnf
4- 找到包含 [mysqld] 部分的文件。如果其中 none 个有,请添加它。 注意:写段名很重要SQL否则无法启动
5- 在文件末尾添加以下行并保存:
[mysqld]
character_set_server = latin1
collation-server = latin1_general_ci
6- 重新启动您的 MariaDB 服务器(如果您有 brew 版本):
brew services stop mariadb
brew services start mariadb
7- 前往您的 Django 项目并使用“__icontains”进行不区分大小写和重音的查询:
User.objects.filter(name__icontains=jeremy)
>>> ['<User: Jéremy>', '<User: Jérémy>', '<User: Jeremy>']