php - 进行变音符号敏感搜索

标签 php mysql search case-sensitive diacritics

我浏览了整个网络,只是想找到使搜索对变音符号不敏感的方法,但我需要相反的方法。

在我的情况下,我需要能够比较具体的符号与上标和下标点(即 ş 和 ạ)和其他一些更常见的符号(á、ã 等),但这些字母可能是任何东西(ṡ、ṛ , ṫ, ḍ, ṅ 等)。期望的结果是这样的:如果我搜索“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/

相关文章:

PHP 警告 : exec() unable to fork

带 EF 6 的 MySql 连接器

php - 我如何在这个脚本中调用它?

mysql - 选择像 "A%"这样的符号,还有一些符号是 AB

java - 如何在 1 维和 n 维空间中有效地选择邻居进行模拟退火

Python - "in"语句搜索对象列表缓慢

c# - ComboBox在字符串中搜索,而不仅仅是第一个字母

php - 检查用户名是否存在不起作用

php - pdo_odbc的配置需要文件在/usr/local/但是没有文件

javascript - 如何通过 $.ajax post 发布 javascript 变量和 html 表单?