我正在使用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。
答案 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发送的值。结果:该值未被转换。
所以可能会发生的事情是您使用阿拉伯语键盘制作波斯语文本。推荐的解决方案是对输入进行某种规范化。
参见这些讨论: