在MySQL中,我的数据库和我的表的整理是utf8_persian_ci。与utf8_general_ci不同,这种特定的整理考虑了“1”,“2”,“3”,......和“1”,“2”,“3”......的相同权重(后者是波斯数字格式) 。相同的权重意味着在搜索查询中应返回波斯语和拉丁语格式。虽然我的数据库,表格甚至collation_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 |
|--------|
| ۱ |
----------
我的第一个问题是我无法弄清楚为什么我必须编写 collate utf8_persian_ci ,尽管MySQL服务器和数据库的默认排序规则是utf8_persian_ci。
我的第二个问题是我正在使用的应用程序正在使用JPA。所以我写的查询是JPQL,它不支持整理utf8_persian_ci 。 我需要在JPQL中整理utf8_persian_ci 的等价代码,或者我应该将MySQL配置为在查询结束时不使用 collate utf8_persian_ci 并获得指定的结果。
答案 0 :(得分:2)
虽然服务器,数据库和表的默认排序规则是utf8_persian_ci
,但这些默认值已被覆盖通过列本身的定义。
您可以在列上强制执行所需的排序规则;例如:
ALTER TABLE my_tbl MODIFY col VARCHAR(123) COLLATE utf8_persian_ci