2017-09-06 87 views
1

我正在使用PDO连接到MySQL数据库。在我的连接字符串中,我已经添加了charset=utf8mb4,我的所有数据库和表格都是utf8mb4_unicode_ci,但是我面临一个问题。PHP MySQL搜索字符编码问题

为了寻找基于其对content表题项我用下面的代码:

SELECT * FROM content WHERE title LIKE '%سيگنالها%'

关键字是一个波斯词。现在上面的代码返回1结果是正确的并且如预期的那样。

如果我让我的PHP应用程序形式,要么通过与MacOS/Windows PC或通过使用Android手机,我得到0的结果进入SAME字。

我跟踪这个问题下来,好像即使由用户输入的字看起来完全一样的一个已经在数据库中,它们实际上是相同。

根据该online tool,十进制字符码

سيگنالها它是:1587年,1 0,1711,1606,1575,1604,1607,1575

虽然

سیگنالها这是:1587,1 0,1711,1606,1575,1604,1607,1575

您是否发现了电子差异?这是粗体。事实上,如果您复制两个值并将它们复制到here中,您将看到自己的差异。

我能做些什么来解决这个恼人的问题呢?我使用PHP 7和MariaDB 10.1。

+0

什么是网页字符集?它必须是utf-8,而且你必须在mysql连接后执行'SET NAMES utf8'。请发布示例代码。 – Akam

+0

@Akam它也是'utf-8'也可以在phpmyadmin中测试。相同的结果。 – VSG24

+0

好吧,这是键盘问题,我也使用Unikurd(kurdish sorani)与波斯语和阿拉伯语相同的字母,有时候,用户使用的键盘与保存在数据库中的Unicode实体不同,但我们解决了这个问题通过用普通替换字母。 – Akam

回答

1

他们是不一样的性格,即使他们看起来是一样的,当弦在一起,甚至可能具有相同的含义。

第一串(1610)是阿拉伯语LETTER FARSI YEH [1],而另一个(1740)为阿拉伯语LETTER YEH [2]。

[1] https://en.wiktionary.org/wiki/%DB%8C [2] https://en.wiktionary.org/wiki/%D9%8A

我还创建了一个简单形式为PHP和测试两个字符串,以查看是否通过$ _POST发送的值被保持。结果:该值未被转换。

所以可能发生的是你使用阿拉伯语键盘来产生波斯语文本。推荐的解决方案是对输入进行某种标准化。

见这些讨论:

1)https://groups.google.com/forum/embed/?place=forum/persian-computing#!topic/persian-computing/xS-G0qIGS8A

2)https://github.com/Samsung/KnowledgeSharingPlatform/blob/master/sameas/lib/lucene-analyzers-common-5.0.0/org/apache/lucene/analysis/fa/PersianNormalizer.java

3)can't search in farsi text with arabic keyboard on iphone