今天我才意识到我的 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"');
在这种情况下,“name”内容将是: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'].'"');
}
除了字符“ă”及其后面的字符未被包括在字符串中外,它按预期字符进行“UPDATE”。我是指该字符和其后的字符没有被包括在字符串中。
此外,使用代码中注释的"iconv()"进行测试也会出现同样的情况,即使使用//IGNORE和//TRANSLIT。
我还测试了几种字符集,包括ISO-8859-1和ISO-8859-15。
Jáuò Iñe
应该是Jáuò Iñe
,对吗?两步 ALTER 可能是适当的(而且相对简单)。请参见 https://dev59.com/0rn4oIgBc1ULPQZFPQY-#71960959。 - Rick James