我正在尝试比较两个搅拌器,一个来自输入,另一个来自数据库。 我在数据库中有这个名字列表,我想检查这个名字是否已经存在于数据库中,但问题是来自塞尔维亚拉丁语(Č,Ć,Đ,Ž,Š)的特殊字符。 Connection有UTF-8字符集mysqli_set_charset($ this-> con,'utf8'),DB有utf-8_unicode_ci校对。
$names = Teachers::returnTeachers();
if(isset($_GET['idRequest']) && $_GET['idRequest'] == 1)
{
$firstName = trim($_GET['firstname']);
$status = "";
foreach($name as $names)
{
if(strtolower(trim($names['firstname'])) == $firstName)
{
echo "This name is already in DB";
$status = "exist";
}
echo "No name";
$status="not exist";
}
如果我在DB中有“NovakĐoković”之类的名字,并且在输入中输入“NovakĐoković”,则表示名称不存在。我不能使用incov()因为C,Ć或Č有不同的含义。名字叫Colović的男人和名叫Čolović的男人不一样。
P.S。当我从DB回显名称时,特殊字符显示正常,而不是问号符号。
编辑:从评论中添加一些代码
public static function returnTeachers(){
$all = [];
$rs = Conection::query("SELECT firstname FROM teachers");
while($row = $rs->fetch_assoc()) {
array_push($all,$row);
}
return $all;
}
答案 0 :(得分:1)
utf8_unicode_ci
有点“通用”,不符合具体要求,例如您对塞尔维亚人的要求。
我没有看到“塞尔维亚”整理,但有几个可能足够接近。看http://mysql.rjweb.org/utf8_collations.html
请注意,utf8_croatian_ci将C
和Č
以及Ć
视为单独的“字母”。捷克,斯洛伐克和波兰(以及其他国家)也做了一些。同样适用于Ž
和Š
。
Ð
被每个排序规则视为单独的字母,但 utf8_unicode_520_ci除外。
所以,选择其他一个排序规则。 utf8_croatian_ci
似乎与您的需求最接近,因为它是唯一一个将C
和Č
以及Ć
视为不同的内容。