我浏览了整个网络,只是想找到使搜索对变音符号不敏感的方法,但我需要相反的方法。
在我的情况下,我需要能够比较具体的符号与上标和下标点(即 ş 和 ạ)和其他一些更常见的符号(á、ã 等),但这些字母可能是任何东西(ṡ、ṛ , ṫ, ḍ, ṅ 等)。期望的结果是这样的:如果我搜索“a”,我只收到“a”,如果我搜索“ş”,我只收到“ş”作为结果,而不是“a”(没有点)。
我读到我需要使用 utf8_bin 并尝试将我的字段排序规则、表排序规则和数据库排序规则更改为它,但没有成功。这是代码:
// "sound" is being passed in by an AJAX call
$sound = $_POST['sound'];
$query = "SELECT * FROM sounds WHERE 'sound' = '$sound'";
$result = mysql_query($query);
// This is then sent back to my page.
我也研究过 COLLATE,但收效甚微。我可能误解了它的探测器用法:
// Attempting to covert the searched string into the utf8_bin format to match my db collations
$query = "SELECT * FROM sounds WHERE 'sound' = '$sound' COLLATE utf8_bin";
当我使用 utf8_general_ci 或 utf8_unicode_ci 时,我得到了“a”或“Ş”的异常(exception)结果,同时返回了“Ş”和“a”。但是,如果我使用 utf8_bin,我在搜索其中任何一个时都一无所获。我相信这是因为在我的数据库中使用 utf8_bin 时这个 - “ṅ(PH)”(我的条目之一) - 被转换为这个 - “e1b98528504829”。那么有没有一种方法可以在查询之前将我的搜索转换为相同的格式?或者只是一种更好的方法来完成这项工作?
谢谢!
最佳答案
我猜你的数据没有标准化。为了使用 utf8_bin 整理序列,您需要使用规范化数据。数据库中的数据和查询中的数据都需要规范化。
字节序列e1 b9 85
是LATIN SMALL LETTER N WITH DOT ABOVE (U+1E45)的UTF-8编码,但是这个可以分解成LATIN SMALL LETTER N (U+006E ) + 结合上面的点 (U+0307)。分解的 UTF-8 编码为 6e cc 87
。 utf8_general_ci 和 utf8_unicode_ci 归类序列会自动处理此问题,但 utf8_bin 不会。
另外,您不应通过直接插入 $sound
来构造查询。这使您的系统容易受到 SQL injection attacks 的攻击,从而在您的系统中打开一个巨大的安全漏洞。 .相反,使用准备好的语句和参数绑定(bind)。 (php 文档有 an example of how to do this 。)
关于php - 进行变音符号敏感搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7629737/