MySQL - 将 ANSI 转换为 Unicode
MySQL - Converting ANSI to Unicode
不知何故,MySQL 数据库中的数据已从 Unicode 转换为 ANSI,导致系统中的许多符号显示不正确。
符号现在显示为:
- –
- •
- ₸
- ε
- 等等
我想将其转换回 Unicode...
我试过:
- 正在将数据库重新导入为 UTF8 字符集
- 使用记事本++ "convert to UTF8..."
- 已将默认字符集 UTF8 添加到 Apache 配置中...
- 一个 PHP 脚本获取所有数据库和表,复制它们,转换数据,然后重新创建原始数据库。
这些方法没有奏效...它们似乎只是让我的数据保持原样,但以后任何使用符号的尝试都可以正常工作。
我想把这些现有的误解改回原来的形式!
数据库示例文本的十六进制输出。
SELECT hex(name) FROM table_name where id = 17;
相当于:SELECT hex('☼STICKY☼');
输出:C3A2CB9CC2BC535449434B59C3A2CB9CC2BC
您显示的输出看起来有点像 "double encoding" 并在 http://mysql.rjweb.org/doc.php/charcoll 中进行了讨论。请转储一些十六进制文本以供确认。
澄清一下,您可能正在查看 utf8(不是 unicode)与 latin1(不是 ANSI)。
@Tomas M - 在 PHP 中,mysqli_set_charset('utf8')
是正确的调用,而不是 SET NAMES utf8。
但是,如果数据在 table(s) 中被破坏,该调用将无济于事。
(编辑——由 OP 在 HEX 之后添加)
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' 之前所期待的吗?你有 "double encoding";解码需要 2 个步骤。
不知何故,MySQL 数据库中的数据已从 Unicode 转换为 ANSI,导致系统中的许多符号显示不正确。
符号现在显示为:
- –
- •
- ₸
- ε
- 等等
我想将其转换回 Unicode...
我试过:
- 正在将数据库重新导入为 UTF8 字符集
- 使用记事本++ "convert to UTF8..."
- 已将默认字符集 UTF8 添加到 Apache 配置中...
- 一个 PHP 脚本获取所有数据库和表,复制它们,转换数据,然后重新创建原始数据库。
这些方法没有奏效...它们似乎只是让我的数据保持原样,但以后任何使用符号的尝试都可以正常工作。
我想把这些现有的误解改回原来的形式!
数据库示例文本的十六进制输出。
SELECT hex(name) FROM table_name where id = 17;
相当于:SELECT hex('☼STICKY☼');
输出:C3A2CB9CC2BC535449434B59C3A2CB9CC2BC
您显示的输出看起来有点像 "double encoding" 并在 http://mysql.rjweb.org/doc.php/charcoll 中进行了讨论。请转储一些十六进制文本以供确认。
澄清一下,您可能正在查看 utf8(不是 unicode)与 latin1(不是 ANSI)。
@Tomas M - 在 PHP 中,mysqli_set_charset('utf8')
是正确的调用,而不是 SET NAMES utf8。
但是,如果数据在 table(s) 中被破坏,该调用将无济于事。
(编辑——由 OP 在 HEX 之后添加)
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' 之前所期待的吗?你有 "double encoding";解码需要 2 个步骤。