【问题标题】:I get dual results from mysql query when using international characters, i.e Å/Ä=A & Ö=O,使用国际字符时,我从 mysql 查询中得到双重结果,即 Å/Ä=A 和 Ö=O,
【发布时间】:2010-10-25 21:18:39
【问题描述】:

例如,如果我搜索名称 Å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

【问题讨论】:

    标签: mysql utf-8


    【解决方案1】:

    您的“问题”是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;
    

    这显然比较慢,因为在查询期间必须对每条记录进行排序规则转换。

    【讨论】:

    • utf8_bin 是唯一适合我的选项,utf8_general_ci 不起作用,我将把整个数据库更改为 utf8_bin
    【解决方案2】:

    数据库、表和列设置为utf8_unicode_ci

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

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

    【讨论】:

    • 我将使用 utf8_bin,将所有用户名存储在 db 中的小写字符中。在搜索之前将用户输入的查询搜索字符串转换为较低的。
    【解决方案3】:

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

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

    【讨论】:

    • 没有任何区别,仍然有 2 个结果
    猜你喜欢
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    相关资源
    最近更新 更多