0

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

符号现在显示如下:

  • ——</li>
  • ?</li>
  • ₸</li>
  • Ω
  • 等等

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

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

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


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

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

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

输出:C3A2CB9CC2BC535449434B59C3A2CB9CC2BC

4

1 回答 1

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'之前所期待的吗?你有“双重编码”;解码它需要两个步骤。

于 2015-02-23T22:51:53.180 回答