【问题标题】:MySQL - Converting ANSI to UnicodeMySQL - 将 ANSI 转换为 Unicode
【发布时间】:2015-04-20 00:00:04
【问题描述】:

不知何故,MySQL 数据库中的数据已经从 Unicode 转换为 ANSI,导致系统中的很多符号显示不正确。

符号现在显示如下:

  • ——
  • ?
  • ¸
  • Ω

我想将其转换回 Unicode...
我试过了:

  • 将数据库重新导入为 UTF8 字符集
  • 使用 Notepad++ “转换为 UTF8...”
  • 将默认字符集 UTF8 添加到 Apache 配置...
  • 一个 PHP 脚本,它获取所有数据库和表,复制它们,转换数据,然后重新创建原始数据库。

这些方法没有奏效......它们似乎只是让我的数据保持原样,但未来任何使用符号的尝试都可以正常工作。
我想将这些现有的误解转换回原来的形式!


数据库中示例文本的十六进制输出。

SELECT hex(name) FROM table_name where id = 17;

相当于:SELECT hex('☼STICKY☼');

输出:C3A2CB9CC2BC535449434B59C3A2CB9CC2BC

【问题讨论】:

  • 你看到使用 phpMyAdmin 的错位字符了吗?有可能你mysql中的数据是正确的,只是你看不到正确。
  • 数据显示来自 mysql 以及应用程序(浏览器)的“错位字符”。使用应用程序将符号放入数据库现在可以正常工作。现有的“错位字符”保持错位。直到本周早些时候,我一直在使用带有符号的数据库和应用程序。
  • 使用phpMyAdmin会不会导致这种类型的编码错误???我试图理解为什么会这样。我觉得它发生在其他一些管理员使用 phpMyAdmin 执行导出/导入/备份/恢复...但它基本上只是在黑暗中拍摄。我不使用 phpMyAdmin 与我的数据库交互
  • 我有类似的经历,所有内容都在网页上正确显示,但 phpMyAdmin 显示它就像在您的示例中一样。原来是php和mysql默认连接的问题,和phpMyAdmin一点关系都没有。
  • 我在导出数据然后重新导入时也有类似的经历。使用 --default-character-set 是我在 mysqldump 命令中忘记的东西:mysqldump --host= --user= --single-transaction --default-character-set=utf8 >

标签: mysql unicode utf-8 character-encoding mojibake


【解决方案1】:

您显示的输出看起来有点像“双重编码”,并在 http://mysql.rjweb.org/doc.php/charcoll 中讨论过。请转储一些十六进制文本以供确认。

为了澄清,您可能正在查看 utf8(不是 unicode)与 latin1(不是 ANSI)。

@Tomas M - 在 PHP 中,mysqli_set_charset('utf8') 是正确的调用,而不是 SET NAMES utf8。

但是,如果数据在表中被破坏,该调用将无济于事。

(编辑 -- 在 HEX 后由 OP 添加)

mysql> SELECT hex(convert(convert(unhex('C3A2CB9CC2BC') using utf8) using latin1));
+----------------------------------------------------------------------+
| hex(convert(convert(unhex('C3A2CB9CC2BC') using utf8) using latin1)) |
+----------------------------------------------------------------------+
| E298BC                                                               |
+----------------------------------------------------------------------+
mysql> SELECT unhex('E298BC');
+-----------------+
| unhex('E298BC') |
+-----------------+
| ☼               |
+-----------------+

'☼'是你在'STICKY'之前所期待的吗?你有“双重编码”;解码需要 2 个步骤。

【讨论】:

  • 如何获取数据库中文本的十六进制??
  • 真的是UTF8 vs latin1吗?我以为我已经尝试过从 unicode 到 ANSI 的转换并得到了类似的结果……有什么区别?编辑我的问题以包含十六进制输出。谢谢!
  • Unicode 是一种字符规范; utf8(以及 utf16 和 utf32)是用计算机字节表示的方式。 ASCII(不是 ANSI)是适用于英语的 7 位编码(128 个代码)。 latin1 是一种 8 位编码,涵盖了大多数西欧语言。我的 charcoll 博客对此进行了更多讨论。 latin1 的次要变体有许多不同的名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 2013-08-21
  • 1970-01-01
相关资源
最近更新 更多