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

现在,符号显示如下:




一种
Ω
等等


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


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


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



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

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


等效于:SELECT hex('☼STICKY☼');

输出:C3A2CB9CC2BC535449434B59C3A2CB9CC2BC

最佳答案

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

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

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

但是,如果表中的数据混乱,该调用将无济于事。

(编辑-由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个步骤对其进行解码。

关于mysql - MySQL-将ANSI转换为Unicode,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28592862/

10-11 03:19
查看更多