字符串比较使用PHP mysql_ * SET NAMES UTF-8和MySQL表用utf8_un

2019-10-17 13:24发布

我有列国家一个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));

当它击中预期我得到一个新的价值第一次:

布尔值false
布鲁塞尔
布尔值true

接下来的时间,我得到:

布尔值true
布鲁塞尔
布尔值true

我倒是很期待。

问题是当它击中非拉丁字符时,每道生产:

布尔值false
巴登 - Württember
布尔值true

当我将其设置为等于他们,然后在接下来的记录拉(每条记录已经被同样进入)失败了,这是当我使用了相同的编码,我真的需要它认识到它们是相同的即使输入的字符都不同。

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

Answer 1:

它看起来像你在你的数据库中的标准化问题。 相反,一遍又一遍存储状态相同的字符串再次,把所有国家的名字到它自己的表,并引用它们。

这也将确保你不会 - 例如,通过事故 - 把二进制不同,但同样看数据到您无法正常以后,你只是做了排列不同的行。

另外,您应该查询不同行和更新它们,这样你就至少有同名的状态相同的二进制字符串数据。 例如,如果MySQL能够真正调整这些国家的字符串,但PHP - 由于它的字符串的二元特性 - 不。



文章来源: String Comparison using PHP mysql_* SET NAMES UTF 8 and Mysql Table With utf8_unicode_ci