php – 剥离外国口音的MySQL查询

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

它使用城市名称查询MySQL数据库,并返回它找到的该城市的所有实例.

我有几个问题:第一个用连字符(例如埃文河畔斯特拉特福);已经通过添加解决了

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

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

我遗留的问题与外国口音有关(特别是:急性,严重,旋律,cedille,波浪形).我尝试了一百万个功能,很多我在这个网站上发现并且无法让它运行起来.

我当前页面的主要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’无效

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

例如,观察这个小查询:

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

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

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

这两个查询都发现简历和简历是平等的.它适用于几乎所有欧洲语言的重音角色.

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

你如何使用它来使用你的数据库?

>确保您的地名列(城市,国家)的字符集设置为utf8,或者更好,更强大和现代的utf8mb4.
>确保这些表的默认排序规则是您选择的字符集的不区分大小写的排序规则.
>只是做你的疑问.你不需要任何特别的东西.例如,WHERE City =’Sèvres’和WHERE City =’sevres’将产生相同的结果.这对于习惯于Google类型搜索的用户来说非常完美.

在更改表格之前,请制作备份副本,以防万一.

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结构将匹配埃文河畔斯特拉特福以及斯特拉特福德郡.

点赞