php - 如何清理MySQL表中的编码

标签 php mysql mysqli encoding heidisql

该系统是一个访问 MySQL 数据库的 PHP 应用程序。第一个表是使用标准 latin1 编码创建的,并通过 PHP 中的 mysqli 填充,无需设置任何编码。 PHP 脚本和数据均以 UTF-8 格式工作。

较新的表已将编码设置为 utf8_bin,并且在每个事务之前发送SET CHARACTER SET utf8

如果我查看 mysql 数据库中的较新表(通过像 HeidiSQL 这样的 SQL 浏览器),每个特殊字符都会正确显示。然而,在每个较旧的表中,典型的 latin1-utf8 错误都是可见的,例如 œ 代表 ü。

是否有一种简单的方法可以通过以下方式之一来解决此问题:

  • 修复每个表的编码,以便在 sql explorer 中正确显示,但保持 PHP 代码不变(使用 SET CHARACTER SET utf8latin1每个语句的前面,适合表编码。(只是一个解决方法)
  • 将所有表的编码切换为 utf8 -> 现在 SET CHARACTER SET utf8 必须在每个 mysqli 连接开始时发送(或者也许有办法将其设置为标准?)
  • 将所有表的编码切换为 latin1 -> 不再需要在事务前面发送 SET CHARACTER SET utf8,但数据库资源管理器中的编码错误。

数据库似乎将所有表都视为 utf8,并显示 latin1 表,因此字符错误。如果没有告知不同,Mysqli 会将所有表视为 latin1。

应用程序是高效的,编码问题对用户来说是不可见的,因为在每个语句前面都会告诉 mysqli 正确的编码。但我觉得这不是一个好的做法。

我认识到数据库的设置方式存在问题,我希望了解解决此问题的最佳实践是什么。

最佳答案

The first tables were created with the standard latin1 encoding and filled via mysqli in PHP

所以,这些表中有垃圾。您需要恢复数据吗?

in front of every transaction SET CHARACTER SET utf8 is sent.

这没用。相反,请在连接后执行一次SET NAMES utf8

œÜ 的 Mojibake。在这个论坛中搜索 Mojibake。

有一些表 latin1 带有 utf8 字节,而其他表是 utf8 ——这将是一个痛苦的困惑。现在停下来清理困惑。一直使用utf8。

Mojibake摘要:

  • 客户端中的字节已正确编码为 utf8(良好)。
  • 您可能默认使用SET NAMES latin1(或set_charset('latin1')或...)进行连接。 (应该是 utf8。)
  • xx 表中的列被声明为CHARACTER SET latin1。 (或者可能是从表/数据库继承的。)(应该是 utf8。)
  • 表中的列可能是也可能不是CHARACTER SET utf8,但它应该是这样。

如果您需要修复数据,则需要“两步更改”,例如

ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;

关于php - 如何清理MySQL表中的编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32205230/

相关文章:

php - 剪切(裁剪)字符串中的一些文本

php - 如何在查询中关联两个表?

php - 从 mysqli_multi_query 获取最后结果

php - 无法计算 MySQL/PHP 列中的值

php - 如何在 php mysql 查询中使用数组?

php - 如何在特定列中选择具有给定值的同一表中的两个不同行

php - 带有位字段的 PDO 准备语句

php - 无法在 PHP 中使用 PDO 获取错误信息

java - 使用改造发送带有一些参数的多部分(文件)

c# - DateTime 从 C# 到 MySQL : incomplete storage