我在mysql中搜索阿拉伯文本时遇到了问题。我在数据库中有一个包含一条记录的行。
display_name
أحمد
但是当我尝试进行一次查询时,遇到了问题。
SELECT * FROM wp_users WHERE display_name LIKE '%احمد%'
我试图在查询的末尾添加
collate utf8_bin
但是它仍然没有起作用。我该怎么办?
احمد == أحمد
我在mysql中搜索阿拉伯文本时遇到了问题。我在数据库中有一个包含一条记录的行。
display_name
أحمد
SELECT * FROM wp_users WHERE display_name LIKE '%احمد%'
我试图在查询的末尾添加
collate utf8_bin
احمد == أحمد
我没有确切的解决方案,但我可以告诉你为什么它不起作用。如果您想要将这两个字符串视为相等,则需要使用不同的排序规则,因为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;
但在你的情况下,它不起作用,更准确的 utf8_unicode_ci
校对也是如此:
SELECT 'احمد'='أحمد' COLLATE utf8_general_ci;
SELECT 'احمد'='أحمد' COLLATE utf8_unicode_ci;
这个图表 显示了MySQL的 utf8_unicode_ci
collation 中用于中东语言的字符映射。您可以看到,أ
和 ا
字符不被视为相等,因此MySQL的默认collations无法解决此问题。
要解决此问题,您有两个选择:在字符串输入MySQL之前(即在PHP中)对它们进行归一化,或扩展MySQL提供适当的排序规则以满足您的需求。
如sємsєм所建议的那样,Ar-PHP 项目 可以帮助您完成前者。您应该分别存储真实用户名和已标准化的用户名,以便您可以搜索一个并显示另一个。另一个项目 还提供了一种重新构造阿拉伯语字符串以更好地在MySQL中使用的方法。
MySQL文档显示如何创建自定义排序规则。它基本上涉及编辑LDML XML文件(至少有一个BBEdit插件可帮助完成此操作)并将其提供给MySQL。这将使您能够创建一种映射,让您将某些字符视为等效字符。这种方法的优点是它对PHP透明,并且您不需要在数据库中添加任何其他列。如果您构建这样的映射,则对于其他阿拉伯语用户跨多种编程语言,而不仅仅是PHP,将是有益的。
$con->set_charset("utf8");
---$con
是一个数据库连接变量。将其更改为你正在使用的变量。这样可能/应该会起作用。 - Funk Forty Ninerاأإآ
并从字符串开头删除它们,然后使用 like。但是,这仅适用于字符串开头或结尾的字母的有限解决方案。 - SaidbakR