字符“ي”和“ی”和波斯语的区别 - Mysql

时间:2011-04-11 01:52:28

标签: mysql utf-8

我正在使用集成了mysql数据库的UTF-8 Persian网站。网站上的所有内容都是通过管理面板导入的,而且都是波斯语。

你可能知道阿拉伯语与波斯语有相同的字母,除了一些。 问题是,当一个人试图用阿拉伯语布局键入键盘时,它会将“ي”写为字符,如果他试图通过带有波斯语布局的键盘键入,则键入“ی”作为字符。

因此,如果一个人搜索'بازی',mysql将不会找到'بازي'作为结果。

重要提示:'ی'不是唯一具有此属性的字符,有很多字符,它们非常相似。

如何解决此问题?

在将数据导入数据库之前,一个简单的天真解决方案似乎将所有“ي”替换为“ی”,但我正在寻找比此更好的解决方案。

8 个答案:

答案 0 :(得分:30)

亲爱的EBAG,我们在 Unicode 中有一个阿拉伯语块,其中包含阿拉伯语& 波斯语字符。

06CC 是波斯语ی 064A 是阿拉伯语ي

默认的Windows键盘使用code page 1256表示阿拉伯语字符,因为阿拉伯语用户远远超过波斯语,因此064A默认ي为普通用户和阿拉伯语用户。

ISIRI制作标准键盘ISIRI 9147并将阿拉伯语和波斯语Yeh放在其上,但Perisan ی是默认字符。使用标准键盘的波斯语用户将使用(并使用)标准波斯语ی‍ while the rest of them use arabicي`。

正如您在我们将数据保存到数据库时通常所说的那样,我们将阿拉伯语ي更改为波斯语‍ی,当我们从中读取时,我们只选择波斯语,所以一切都是真的。

第二种方法是在Web应用程序中使用JavaScript文件来控制用户输入。大多数波斯网站都使用这种方法将字符保存到数据库中。在此方法中,用户无需为波斯语或阿拉伯语键盘安装任何键盘布局。他/她只是将键盘放在English上,然后在JavaScript文件开发人员中检查哪个角色适合他。 Here您可以找到适用于网络应用的ISIRI 9147 javascript和使用它的波斯语指南。

第三种方法是使用屏幕键盘,其功能与前一个具有用户界面的键盘相同,通常适用于不熟悉波斯键盘的人。

第四种方法是搜索两种方言。如您所知,当您安装MySqlSQL Server时,您可以设置 collation ,并且您还可以选择支持方言(以及案例敏感度)。如果您使用方言启用阿拉伯语校对,则可以获得两者的结果,通常这在sql server中可以正常工作。我不会在MySql中对其进行测试。这是最好的解决方案。

但如果我是你,我会实施一个简单的sql function,获取nvarchar并返回nvarchar。然后我想在写数据时调用它。无论何时你想阅读,你都可以选择标准的。

对不起长尾巴。

答案 1 :(得分:12)

update TABLENAME set COLUMNNAME=REPLACE(COLUMNNAME,NCHAR(1610),NCHAR(1740))

update TABLENAME set COLUMNNAME=REPLACE(COLUMNNAME,'ي',N'ی')

答案 2 :(得分:3)

这称为整理。这是MySQL用来比较两个不同的字符。我担心我对波斯语或阿拉伯语一无所知,但概念是一样的。基本上你有两个字符映射到相同的基值。您需要找到将ي映射到ی的排序规则。我担心在没有更多了解语言的情况下,我会有所帮助。

答案 3 :(得分:3)

第一个字母(ي)是阿拉伯字母表中的Yā'。 第二个字母(ی)是你在perso-arabic字母表中。

更多关于perso-arabic字母: http://en.wikipedia.org/wiki/Perso-Arabic_alphabet

“在最后的ye(ی)中删除了两个点。阿拉伯语将最后的yā'与两个点和alif maqsura(埃及阿拉伯语除外)区分开来,这样写成最后的yā',没有两个点。

因为波斯人在最后的叶子中丢掉了两个点,所以alif maqsura无法与正常的最后一个人区分开来。例如,Musâ(摩西)这个名字就是موسی。在Musâ的最后一封信中,波斯人没有区分你或者alif maqsura。“

似乎是一个有趣的问题...

答案 4 :(得分:2)

我在5-6年前遇到类似的情况,当时Lucene不是MySQL的选择而且没有Sphinx(从未尝试过Sphinx的结果),但我所做的是我发现了大部分的可能的替换,并将它们放在PHP中的数组中。 因此,如果输入关键字包含任何这些字符,我生成了所有可能的替代字符。

因此,对于'بازی'的输入,我会生成{'بازي','بازی'}然后我会查询MySQL两者,就像下面最简单的查询一样:

SELECT title,Describtion FROM Games WHERE Description LIKE '%بازي%' OR Description LIKE '%بازی%' 

替代品的主要清单不是很长。

答案 5 :(得分:1)

如果您有可能切换数据库引擎,您可能需要查看PostgreSQL的全文搜索功能:

http://www.postgresql.org/docs/9.0/static/textsearch.html

除此之外,您可以对其进行配置,使其索引/搜索非重音字符,并且您可以定义各种其他字典(例如停用词,同义词库,同义词等)。

如果没有,请考虑使用SphinxLucene代替like语句进行搜索。

答案 6 :(得分:1)

我知道回答这个话题就像是从它的坟墓中挖出一具尸体,因为它已经很老了但是我想分享我的经验恕我直言,最好的方法是包装你的请求并申请你的替代品。它比其他方式更便携。这是一个java样本

public class FarsiRequestWrapper extends HttpServletRequestWrapper{

@Override
public String getParameter(String name) {
    String parameterValue = super.getParameter(name);
    parameterValue.replace("ی", "ي");       
    parameterValue.replace("\\s+", " ");
    parameterValue.replace("ک","ک");
    return parameter.trim();
}

}

然后你只需要设置一个过滤器servlet

public class FarsiFilter implements Filter{

public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {

    HttpServletRequest req = (HttpServletRequest) request;
    FarsiRequestWrapper rw = new FarsiRequestWrapper(req);
    chain.doFilter(rw, response);
}

} 虽然这种方法只适用于Java,但我发现它更简单,更好。

答案 7 :(得分:0)

您必须在替换字符前使用'N ,例如:
REPLACE(COLUMNNAME,N 'ي',N 'ی')