PHP MySQL搜索字符编码问题

时间:2017-09-06 18:33:25

标签: php mysql character-encoding

我正在使用PDO连接到MySQL数据库。在我的连接字符串中,我已经添加了charset=utf8mb4,我的所有数据库和表格都是utf8mb4_unicode_ci,但我遇到了问题。

为了根据content表格上的标题搜索条目,我使用下面的代码:

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

关键字是波斯语。现在上面的代码返回1个正确且符合预期的结果。

但是如果我在我的PHP应用中制作表单并使用macOS / Windows PC或使用Android手机输入 SAME 字词,我会得到0结果

我追踪了这个问题,看起来即使用户输入的单词看起来与数据库中已有的单词完全相同,但实际上它们 NOT 相同。

根据此online tool,十进制字符代码

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

虽然

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

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

我该怎么做才能解决这个恼人的问题?我正在使用PHP 7和MariaDB 10.1。

2 个答案:

答案 0 :(得分:1)

“سيگنالها”中的第一个“ي”与第二个单词“سیگنالها”中的不同字符是“ی”

Firstي:是阿拉伯语的字母(U+064A

第二ی:是阿拉伯语信件FARSI YEH(U+06CC

它们的Unicode实体不同,因此它们不匹配。 有关详细信息,请参阅https://www.key-shortcut.com/en/writing-systems/%EF%BA%95%EF%BA%8F%D8%A2-arabic-alphabet/

答案 1 :(得分:1)

它们不是同一个角色,即使它们在被捆绑在一起时看起来相同,甚至可能具有相同的含义。

第一个字符串(1610)是ARABIC LETTER FARSI YEH [1]而另一个(1740)是ARABIC 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