剥离外国口音的MySQL查询
我必须承认,我对php一无所知,而且我的当前脚本被继承了......
它查询与MySQL数据库city
名称,并返回它发现的所有实例city
。
我遇到了几个问题:第一个用连字符(例如Stratford-upon-Avon); 这已通过添加解决
$searchq = str_replace( '-', ' ', $searchq );
这允许我在没有连字符的情况下输入数据库中的数据。
我剩下的问题与外国口音有关(特别是:急性,严重,旋转,塞迪耶,代字)。 我尝试了一百万个功能,我在这个网站上找到的许多功能并没有设法让它起作用。
我当前页面的主要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琼斯的注意力?
我被卡住了,不知道如何处理脚本部分
另一个编辑当我在表中输入这个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'
这两个查询都发现résumé
和resume
是平等的。 它适用于几乎所有欧洲语言重音字符。
这些查询包含显式创建为unicode字符串的两个字符串常量。 然后使用case_insensitive整理比较它们。 在整理中,e-acute和e-grave的大小写形式都被认为是相同的。
你如何得到这个与你的数据库一起工作?
确保你的地名栏( City
, Country
)的字符集设置为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
构建将与Stratford-upon-Avon
以及Stratfordshire
匹配。