规范化阿拉伯语文本mysql

Ahm*_*med 8 php mysql wordpress arabic diacritics

我在mysql中搜索阿拉伯语文本时遇到问题.我在数据库中有一行包含记录

display_name
????
Run Code Online (Sandbox Code Playgroud)

但是当我尝试用查询进行查询时

SELECT * FROM wp_users WHERE display_name LIKE '%????%'
Run Code Online (Sandbox Code Playgroud)

我试图在查询结束时添加

collate utf8_bin
Run Code Online (Sandbox Code Playgroud)

但它也没有用.我怎么能

???? == ????
Run Code Online (Sandbox Code Playgroud)

Syn*_*hro 9

我没有确切的解决方案,但我可以告诉你它为什么不起作用.如果您希望这两个字符串被视为相等,则需要使用不同的排序规则,因为utf8_bin比较确切的代码点,并且当考虑这种方式时,这两个字符串显然不相同.通常情况下,MySQL的utf8_general_ci校对会提供音译和规范化,例如所有这些匹配:

SELECT 'a'='A' COLLATE utf8_general_ci;
SELECT 'ü'='u' COLLATE utf8_general_ci;
SELECT 'ß'='ss' COLLATE utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)

但在你的情况下,它不起作用,也没有更准确的utf8_unicode_ci整理:

SELECT '????'='????' COLLATE utf8_general_ci;
SELECT '????'='????' COLLATE utf8_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

此图表显示MySQL的utf8_unicode_ci排序规则中的中东语言的字符映射,您可以看到??字符不相等,因此MySQL的默认排序规则不能解决此问题.

要解决这个问题,你有两个选择:在你的字符串到达​​MySQL之前规范化你的字符串(即在PHP中),或者扩展MySQL以提供适当的校对来做你需要的.

正如sємsєм建议的那样,Ar-PHP项目可以帮助前者.您应该单独存储您的真实用户名和标准化用户名,以便您可以搜索一个并显示另一个.另一个项目还提供了一种重写阿拉伯语字符串的方法,以便在MySQL中更好地工作.

MySQL文档展示了如何创建自定义排序规则.它主要涉及编辑LDML XML文件(至少有一个BBEdit插件来帮助解决这个问题)并将其提供给MySQL.这将允许您创建一个映射,使您可以将某些字符视为等效字符.这种方法的优点是它对PHP透明,您不需要在数据库中添加任何其他列.如果您构建这样的映射,那么对于跨多种编程语言的其他阿拉伯用户而言,这将是有益的,而不仅仅是PHP.

  • 我已经创建了一个自定义排序规则 utf8_arabic,如果其他人遇到同样的问题 https://gist.github.com/ahmednasir91/0cf805b5843b295e8959 (2认同)