gpt4 book ai didi

php - mySQL - 匹配拉丁(英语)表单输入到 utf8(非英语)数据

转载 作者:行者123 更新时间:2023-11-29 00:08:55 27 4
gpt4 key购买 nike

我在 mySQL 中维护一个音乐数据库,如何返回存储在例如当人们搜索“Tiesto”时是“Tiësto”?

如果有任何不同,所有数据都存储在全文索引下。

我已经结合使用了 PHP 中的 Levenshtein 和 SQL 中的 REGEXP - 不是为了解决这个问题,而是为了提高总体可搜索性。

PHP:

function Levenshtein($word) {

$words = array();
for ($i = 0; $i < strlen($word); $i++) {
$words[] = substr($word, 0, $i) . '_' . substr($word, $i);
$words[] = substr($word, 0, $i) . substr($word, $i + 1);
$words[] = substr($word, 0, $i) . '_' . substr($word, $i + 1);
}
$words[] = $word . '_';
return $words;
}

$fuzzyartist = Levenshtein($_POST['searchartist']);
$searchimplode = "'".implode("', '", $fuzzyartist)."'";

MySQL:

SELECT *
FROM new_track_database
WHERE artist REGEXP concat_ws('|', $searchimplode);

补充一下,我经常在 PHP 中执行字符集转换和字符串清理,但这些一直是其他方式 - 标准化非拉丁字符。我无法全神贯注地执行相反的过程,但只能在某些情况下根据我存储的数据进行。

最佳答案

一个可能的解决方案是在“艺术家”旁边的数据库中创建另一个列,例如“artist_normalized”。在这里,在填充表格时,您可以插入字符串的“规范化”版本。然后可以针对 artist_normalized 列执行搜索。

测试代码:

<?php
$transliterator = Transliterator::createFromRules(':: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', Transliterator::FORWARD);
$test = ['abcd', 'èe', '€', 'àòùìéëü', 'àòùìéëü', 'tiësto'];
foreach($test as $e) {
$normalized = $transliterator->transliterate($e);
echo $e. ' --> '.$normalized."\n";
}
?>

结果:

abcd --> abcd
èe --> ee
€ --> €
àòùìéëü --> aouieeu
àòùìéëü --> aouieeu
tiësto --> tiesto

魔术是由 Transliterator 类完成的。指定的规则执行三个操作:分解字符串,删除变音符号,然后重组字符串,规范化。PHP 中的音译器构建在 ICU 之上,因此通过执行此操作,您将依赖于 ICU 库的表,这些表是完整且可靠的。

注意:此解决方案需要 PHP 5.4 或更高版本以及 intl 扩展。

关于php - mySQL - 匹配拉丁(英语)表单输入到 utf8(非英语)数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26185163/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com