我有一个列为 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_encode
和Normalizer::normalize
来获得比较的真实结果,这样我就可以在控制结构中使用它(例如,如果你上次见过它的话)这次打印它但是它失败了。
答案 0 :(得分:0)
您的数据库中似乎存在规范化问题。不是一遍又一遍地将相同的状态存储为字符串,而是将所有状态名称放入它自己的表中并引用它们。
这也将确保您不会 - 例如偶然 - 将二进制不同但看起来同样的数据放入不同的行中,以后就无法正确对齐。
或者,您应该查询不同的行并更新它们,以便至少具有相同命名状态的相同二进制字符串数据。例如。如果Mysql能够实际对齐这些状态字符串,但PHP - 由于它的字符串的二进制特性 - 不是。