MySQL在搜索查询中不返回波斯语和英语数字

时间:2012-07-23 13:04:38

标签: java mysql jpa jpql

在MySQL中,我的数据库和我的表的整理是utf8_persian_ci。与utf8_general_ci不同,这种特定的整理考虑了“1”,“2”,“3”,......和“1”,“2”,“3”......的相同权重(后者是波斯数字格式) 。相同的权重意味着在搜索查询中应返回波斯语和拉丁语格式。虽然我的数据库,表格甚至collat​​ion_server(我在my.cnf中定义)都是utf8_persian_ci,但我的搜索查询不会返回波斯语和拉丁语数字:

表:

 --------
|  col   |
|--------|
|   1    |
|--------|
|   ۱    |
----------

(col类型是varchar)

查询:

SELECT * FROM my_tbl tbl where tbl.col like "1"

结果:

 --------
|  col   |
|--------|
|   1    |
|--------|

我发现以下查询返回了我想要的结果:

SELECT * FROM my_tbl tbl where tbl.col like "1" collate utf8_persian_ci

返回:

 --------
|  col   |
|--------|
|   1    |
|--------|
|   ۱    |
----------

我的第一个问题是我无法弄清楚为什么我必须编写 collat​​e utf8_persian_ci ,尽管MySQL服务器和数据库的默认排序规则是utf8_persian_ci。

我的第二个问题是我正在使用的应用程序正在使用JPA。所以我写的查询是JPQL,它不支持整理utf8_persian_ci 。 我需要在JPQL中整理utf8_persian_ci 的等价代码,或者我应该将MySQL配置为在查询结束时不使用 collat​​e utf8_persian_ci 并获得指定的结果。

1 个答案:

答案 0 :(得分:2)

虽然服务器数据库的默认排序规则是utf8_persian_ci,但这些默认值已被覆盖通过列本身的定义。

您可以在列上强制执行所需的排序规则;例如:

ALTER TABLE my_tbl MODIFY col VARCHAR(123) COLLATE utf8_persian_ci