2

在 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。所以我写的查询是不支持collat​​e utf8_persian_ci的 JPQL 。我需要一个等效代码来整理JPQL 中的 utf8_persian_ci,或者我应该将 MySQL 配置为 在查询结束时不使用整理 utf8_persian_ci并获得指定的结果。

4

1 回答 1

2

虽然serverdatabasetable的默认排序规则是utf8_persian_ci,但这些默认值可能已被列本身的定义覆盖。

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

ALTER TABLE my_tbl MODIFY col VARCHAR(123) COLLATE utf8_persian_ci
于 2012-07-23T13:32:09.377 回答