【发布时间】:2012-03-13 13:12:41
【问题描述】:
直到今天我才意识到我的 PHP 脚本中缺少这个:
mysql_set_charset('utf8');
我所有的表都是 InnoDB,排序规则“utf8_unicode_ci”,我所有的 VARCHAR 列也是“utf8_unicode_ci”。我的 PHP 脚本中有mb_internal_encoding('UTF-8');,我所有的 PHP 文件都编码为 UTF-8。
所以,直到现在,每次我“插入”带有变音符号的东西时,例如:
mysql_query('INSERT INTO `table` SET `name`="Jáuò Iñe"');
在本例中,“名称”内容为:Jáuò Iñe。
由于我修复了 PHP 和 MySQL 之间的字符集,新的 INSERT 现在可以正确存储。但是,我想修复目前“混乱”的所有旧行。我已经尝试了很多东西,但它总是会破坏第一个“非法”字符的字符串。这是我当前的代码:
$m = mysql_real_escape_string('¿<?php echo "¬<b>\'PHP á (á)ţăriîş </b>"; ?> ă-ţi abcdd;//;ñç´พดแทฝใจคçăâξβψδπλξξςαยนñ ;');
mysql_set_charset('utf8');
mysql_query('INSERT INTO `table` SET `name`="'.$m.'"');
mysql_set_charset('latin1');
mysql_query('INSERT INTO `table` SET `name`="'.$m.'"');
mysql_set_charset('utf8');
$result = mysql_iquery('SELECT * FROM `table`');
while ($row = mysql_fetch_assoc($result)) {
$message = $row['name'];
$message = mb_convert_encoding($message, 'ISO-8859-15', 'UTF-8');
//$message = iconv("UTF-8", "ISO-8859-1//IGNORE", $message);
mysql_iquery('UPDATE `table` SET `name`="'.mysql_real_escape_string($message).'" WHERE `a1`="'.$row['a1'].'"');
}
它使用预期的字符“更新”,除了字符串在字符“ă”之后被截断。我的意思是,该字符和后面的字符不包含在字符串中。
此外,使用“iconv()”(在代码上注释)进行测试也是如此,即使使用 //IGNORE 和 //TRANSLIT
我还测试了几个字符集,介于 ISO-8859-1 和 ISO-8859-15 之间。
【问题讨论】:
标签: php mysql utf-8 character-encoding iso-8859-1