【问题标题】:String Comparison using PHP mysql_* SET NAMES UTF 8 and Mysql Table With utf8_unicode_ci字符串比较使用 PHP mysql_* SET NAMES UTF 8 和 Mysql Table With utf8_unicode_ci
【发布时间】:2012-12-28 10:57:28
【问题描述】:

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

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

布尔假
布鲁塞尔
布尔真

下次我得到:

布尔真
布鲁塞尔
布尔真

正如我所料。

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

布尔假
巴登-符腾堡
布尔真

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

无论发生什么,我都尝试utf8_encode 和Normalizer::normalize 从比较中获得真实结果,因此我可以在控制结构中使用它(例如,如果您上次看到它,请不要打印它这次)但它失败了。

【问题讨论】:

  • 您能否将SHOW CREATE TABLE newmeets 的输出包含在您的问题中?表和列上的字符集和排序规则很可能是伪造的。
  • Charles - 你是这个意思吗? -- 表newmeets 的表结构 -- CREATE TABLE IF NOT EXISTS newmeets (ID int(11) NOT NULL auto_increment, Country text collat​​e utf8_unicode_ci NOT NULL, State varchar(50) collat​​e utf8_unicode_ci NOT NULL, PRIMARY KEY (ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=110 ;
  • 谢谢查尔斯,十六进制转储是查看它的方式,它们向我展示了虽然我正在复制值,但它们仍然不一样......回到输入阶段。
  • 不确定我需要做什么才能为您的声誉增加荣誉?

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


【解决方案1】:

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

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

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

【讨论】:

  • Charles - 你是这个意思吗? -- 表 newmeets 的表结构 -- CREATE TABLE IF NOT EXISTS newmeets (ID int(11) NOT NULL auto_increment, Country text collat​​e utf8_unicode_ci NOT NULL, State varchar(50) collat​​e utf8_unicode_ci NOT NULL, PRIMARY KEY (ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=110 ;
  • 对不起忽略上面我的意思是写 SELECT COUNT(State) AS "Count", State GROUP BY State ORDER BY State LIMIT 0 , 30 Count State 61 Baden-Württember 4 巴伐利亚 2 布鲁塞尔 17
  • 因为实际上只有一小部分表会被分配一个状态,我希望避免将它们存储在单独的表中并引用它们。通过对它们进行更新,所有当前状态都已更新为完全相同的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2017-10-28
相关资源
最近更新 更多