1

我有一个带有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));

当它第一次达到预期的新值时,我得到:

布尔 假
布鲁塞尔
布尔 真

下次我得到:

布尔真
布鲁塞尔
布尔真

正如我所期望的那样。

当每次通过时遇到非拉丁字符时,问题就出现了:

boolean false
Baden-Württember
boolean true

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

不管发生了什么,我都尝试过utf8_encodeNormalizer::normalize从比较中得到一个真实的结果,这样我就可以在控制结构中使用它(例如,如果你上次看到它,这次不要打印它)但它失败了。

4

1 回答 1

0

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

这也将确保您不会 - 例如意外 - 将二进制不同但外观相同的数据放入不同的行中,您以后无法像刚才那样正确对齐。

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

于 2012-12-28T11:09:54.547 回答