使用PHP mysql_ * SET NAMES UTF 8和Mysql表与utf8_unicode_ci进行字符串比较

时间:2012-12-28 10:57:29

标签: php mysql utf-8 character-encoding unicode-normalization

我有一个列为 State 的Mysql表 - 状态来自欧洲各地 - 表和列位于utf8_unicode_ci

当我调用数据库时,我使用

mysql_select_db($database_WTF, $WTF);
mysql_query('SET NAMES utf8');
$query_Recordset1 = "SELECT * 
     FROM newmeets
     WHERE newmeets.`State` IS NOT NULL 
     AND newmeets.`State` !=  ''
     ORDER BY newmeets.`State` ASC ";

然后我通过这个简单的循环

运行它
mysql_select_db($database_WTF, $WTF);
mysql_query('SET NAMES utf8');
$query_Recordset1 = "SELECT * 
     FROM newmeets
     WHERE newmeets.`State` IS NOT NULL 
     AND newmeets.`State` !=  ''
     ORDER BY newmeets.`State` ASC ";

$LastState = "";
do {
    echo
    var_dump($LastState == $row_Recordset1['State']);
    echo $row_Recordset1['State'];
    $LastState = $row_Recordset1['State'];
    var_dump($LastState == $row_Recordset1['State']);
    echo "<hr>";
} while ($row_Recordset1 = mysql_fetch_assoc($Recordset1));

第一次按预期达到新值时,我得到:

  

布尔值假
  布鲁塞尔
  布尔值

下次我得到:

  

布尔值true   布鲁塞尔
  布尔值

正如我所料。

当每次传球产生时,当它击中非拉丁字符时出现问题:

  

布尔值假
  巴登 - Württember
  布尔值

当我将它们设置为相等时它们是,然后当拉下一条记录(并且每条记录都被输入相同)时它就会失败,这就是当我使用相同的编码时,我实际需要它来识别它们即使输入的字符不同,也是一样的。

无论发生了什么,我都尝试utf8_encodeNormalizer::normalize来获得比较的真实结果,这样我就可以在控制结构中使用它(例如,如果你上次见过它的话)这次打印它但是它失败了。

1 个答案:

答案 0 :(得分:0)

您的数据库中似乎存在规范化问题。不是一遍又一遍地将相同的状态存储为字符串,而是将所有状态名称放入它自己的表中并引用它们。

这也将确保您不会 - 例如偶然 - 将二进制不同但看起来同样的数据放入不同的行中,以后就无法正确对齐。

或者,您应该查询不同的行并更新它们,以便至少具有相同命名状态的相同二进制字符串数据。例如。如果Mysql能够实际对齐这些状态字符串,但PHP - 由于它的字符串的二进制特性 - 不是。