剥离外部重音的MySQL查询

时间:2015-12-12 10:24:19

标签: php mysql diacritics

我必须承认我对php一无所知,并且我当前的脚本是继承的......

它使用city名称查询MySQL数据库,并返回它找到city的所有实例。

我遇到了一些问题:第一个与连字符有关的问题(例如Stratford-upon-Avon);已经通过添加

解决了
$searchq = str_replace( '-', ' ', $searchq );

允许我在没有连字符的情况下输入数据库中的数据。

我剩下的问题与外国口音有关(特别是:急性,严重,抑扬,cedille,tilde)。我尝试了一百万个功能,很多我在这个网站上找到的并且没有设法让它工作。

我当前页面的主要PHP代码是这个

$searchq = filter_var("%{$_POST['keyword']}%", FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH); // Sanitize the string

$ searchq = str_replace(' - ','',$ searchq);

$sql = "SELECT Image, Chain, Country, City, Top as '', Medium as '', Low as '' FROM Chains WHERE Country LIKE ? OR City LIKE ?"; // Your query string

$prepare = $mysqli->prepare($sql); // Prepare your query string
$prepare->bind_param('ss', $searchq, $searchq); // Bind the placeholders to your search variables
// s = string | i = integer | d = double | b = blob
$prepare->execute(); // Execute the prepared statement
$prepare->store_result(); // Store the results for later checking

我已经避免来到这个论坛,因为据我所知,它适用于高级开发人员,我不是其中之一......

以上所有代码都是删除带重音的字母,而不是用没有重音的相同字母替换它

修改

我如何获得Ollie Jones'再注意一下?

我被困住了,不知道如何处理脚本部分

另一个编辑 当我在表SQL

中输入它时

ALTER TABLE链转换为字符集utf8mb4 COLLATE utf8_general_ci;

我得到了这个警告,什么也没做完......

#1253 - COLLATION' utf8_general_ci'对于CHARACTER SET' utf8mb4'

无效

1 个答案:

答案 0 :(得分:2)

MySQL的字符集和排序规则功能旨在正确处理此类事情,而无需额外的搜索列。

例如,观察这个小问题:

select _utf8'résumé' COLLATE utf8_general_ci = _utf8'resume'

或者,使用更现代的utf8mb4字符集,

select _utf8mb4'résumé' COLLATE utf8mb4_general_ci = _utf8mb4'resume'

这两个查询都发现résuméresume相等。它适用于几乎所有欧洲语言的重音角色。

这些查询包含两个显式创建为unicode字符串的字符串常量。然后使用 case_insensitive 排序规则对它们进行比较。在该校对中,e-acute和e-grave的大小写形式都被认为是相同的。

如何使用数据库?

  1. 确保您的地名列(CityCountry)的字符集设置为utf8,或者更好,更健壮,更现代{{ 1}}。

  2. 确保这些表的默认排序规则是您选择的字符集的不区分大小写的排序规则。

  3. 只需进行查询。你不需要任何特别的东西。例如,utf8mb4WHERE City = 'Sèvres'会产生相同的结果。这对于习惯使用Google类型搜索的用户来说非常完美。

  4. 在更改表格之前,请制作备份副本以防止搞砸了。

    WHERE City = 'sevres'

    然后使用此类命令更改表格中的列。

    CREATE TABLE chains_backup SELECT * FROM chains
    

    代替 alter table chains modify City varchar(255) character set utf8mb4 collate utf8mb4_general_ci ,您需要使用列的实际数据类型。你没告诉我们那是什么,所以我猜。

    您为每个列选择的默认排序规则将烘焙到索引中。因此,您的变音不敏感搜索不仅准确,而且速度快。

    请注意,西班牙语varchar(255)是一个奇怪的案例。通用排序规则ññ相同。但在西班牙语词典编纂中,n是另一个字母。因此,如果您想要按字母顺序排列西班牙语地名,则需要ñutf8_spanish_ci归类。

    您的问题中显示的代码的好消息是:当您使用不区分大小写的排序规则时,您根本不需要utf8mb4_spanish_ci函数。

    您可能希望使用just_clean而不是WHERE City LIKE 'stratford%'进行搜索 - 这样您的查询就可以匹配搜索字词的前几个字符。 WHERE City = 'stratford'构造符合LIKE以及Stratford-upon-Avon