当使用国际字符时,我从mysql查询得到双重结果,i.nÅ/Ä= A& O = O,

时间:2010-10-25 21:18:40

标签: mysql utf-8

例如,如果我搜索Åsa这个名字,我只想得到Åsa而不是Asa的名字,与Björn相同而不是Bjorn

$query="select * from users where username like 'Björn'";
$result=mysql_query($query);
$num=mysql_num_rows($result);
echo"$num";
$i=0;
while($i<$num){     
$id=mysql_result($result,$i,"id");
$name=mysql_result($result,$i,"username");    
echo"<br/>$id,$name";
$i++;
}

结果

34,Björn
67,Bjorn

只应显示结果34 我正在使用

mysql_query("SET NAMES utf8");
mysql_query( "SET CHARACTER SET utf8");

数据库,表和列设置为utf8_unicode_ci

3 个答案:

答案 0 :(得分:6)

您的“问题”是utf8_unicode_ci整理。该归类确实进行了“角色扩展”,这意味着即使在=比较中,变音符号及其基本字符也被视为相同的

A = Ä
O = Ö
...

此mySQL手册页上的第二个示例解释了该问题:9.1.7.8. Examples of the Effect of Collation

您需要做的是切换到区分变音符号和基本字符的排序规则(例如utf8_general_ciutf8_general_bin),或者仅在进行比较时切换到不同的排序规则:

select * from users where username like 'Björn' COLLATE utf8_general_ci;

这显然较慢,因为在查询期间必须为每条记录进行整理转换。

答案 1 :(得分:1)

  

数据库,表和列设置为utf8_unicode_ci

这种整理故意使许多重音字符与其不重音的基础相匹配。通常这就是你想要的,有时却不是。如果不是,您必须选择最适合您正在使用的语言规则的排序规则。您可以搜索Here's some tables个MySQL排序规则以尝试找到合适的内容。

utf8_swedish_ci是一种常用的可能性,它不会将A /Å/Ä和O /Ö整理在一起,但其他重音字符仍然整理在一起。不幸的是,我看不到很好的校对,知道各种欧洲重音字母,但仍然将它们视为不同。如果您根本不需要不区分大小写的匹配,则可以使用utf8_bin

答案 2 :(得分:-1)

当您的意思是LIKE时,请不要使用=查询。

$query="select * from users where username = 'Björn'";