进行变音敏感搜索

时间:2011-10-02 22:45:31

标签: php mysql search case-sensitive diacritics

我在网上看到的只是为了找到让搜索对变音字符不敏感的方法,但我需要相反的方法。

在我的情况下,我需要能够比较具有上标和下标点(即ȧ&ạ)和其他一些更常见的ace(á,ã等)的符号,但这些字母可能是任何东西(ṡ, ṛ,ṫ,ḍ,ṅ等)。期望的结果将是这样的:如果我搜索“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”或“ȧ”的例外结果,同时返回“ȧ”和“a”。但是,如果我使用utf8_bin,在搜索其中任何一个时我都什么也得不到。我相信这是因为在我的数据库中使用utf8_bin这个 - “ṅ(PH)”(我的一个条目) - 转换为此 - “e1b98528504829”。那么有没有办法在查询之前将我的搜索转换为相同的格式?或者只是一个更好的方法来使这项工作?

谢谢!

2 个答案:

答案 0 :(得分:2)

我的猜测是你的数据没有标准化。要使用utf8_bin整理顺序,您需要使用标准化数据。数据库中的数据和查询中的数据都需要进行标准化。

字节序列e1 b9 85是带有DOT ABOVE(U + 1E45)的LATIN SMALL LETTER N的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的攻击,从而为您的系统带来巨大的安全漏洞。而是使用预准备语句和参数绑定。 (php文档有an example of how to do this。)

答案 1 :(得分:0)

好的,在朋友的帮助下我得到了它的工作。事实证明,它也适用于utf8_general_ci整理。

我的第一个问题是我如何将数据输入数据库。我曾经使用phpMyAdmin来做这件事,由于某些原因,我没有正确编码数据,而且我的所有垃圾箱都出错了。这是通过编写我自己的sql来输入值来解决的。

其次,我最终使用PHP函数iconv()来编码来自网页的数据。这两个解决方案组合在一起得到了匹配的值,整个脚本运行良好。

感谢大家的帮助和建议......真的很感激,相信我,不会浪费。我花了很长时间摆弄所有人。

干杯!