php - 如何更正 MySQL utf8_general_ci 字段中的双编码 UTF-8 字符串?

标签 php mysql utf-8

我必须重新设计一个类,其中(除其他外)UTF-8 字符串被错误地双重编码:

$string = iconv('ISO-8859-1', 'UTF-8', $string);
:
$string = utf8_encode($string);

这些错误字符串已保存到 MySQL 数据库中的多个表字段中。所有受影响的字段都使用排序规则utf8_general_ci

通常我会设置一个小的 PHP 补丁脚本,循环遍历受影响的表,选择记录,通过在双编码字段上使用 utf8_decode() 更正错误记录并更新它们。

由于这次我有很多巨大的 table ,而且错误只影响德语变音符号 (äöüßÄÖÜ),我想知道是否有比这更智能/更快的解决方案。

像下面这样的纯 MySQL 解决方案安全且值得推荐吗?

 UPDATE `table` SET `col` = REPLACE(`col`, 'ä', 'ä');

还有其他解决方案/最佳做法吗?

最佳答案

更改表以将列字符集更改为 Latin-1。您现在将拥有单独编码的 UTF-8 字符串,但位于其排序规则应为 Latin-1 的字段中。

然后您要做的是,通过二进制字符集将列字符集改回 UTF-8 - 这样 MySQL 就不会在任何时候转换字符。

ALTER TABLE MyTable MODIFY MyColumn ... CHARACTER SET latin1
ALTER TABLE MyTable MODIFY MyColumn ... CHARACTER SET binary
ALTER TABLE MyTable MODIFY MyColumn ... CHARACTER SET utf8

(是正确的语法 iirc;将适当的列类型放在 ... 所在的位置)

关于php - 如何更正 MySQL utf8_general_ci 字段中的双编码 UTF-8 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5951871/

相关文章:

PHP 和 CSS 百分比栏不显示 div

php - 投票按钮的数据库设计

MySQL:两次使用同一个表创建新表

PostgreSQL:编码 "UTF8"的字符在 plperl 存储过程中的 "LATIN1"中没有等效项

php - 如何在类中实现回调方法 (PHP)

PHP:将单个数组输出为多个列表

php - fatal error : Call to a member function getPk() on a non-object (P4A, MySQL)

python - Django - 不保存在 PostGresql 数据库中

javascript - 转义 HTML 标签。字符集编码可能存在任何问题吗?

mysql 正则表达式 utf-8 字符