复制后编码混合

时间:2015-04-05 16:11:41

标签: php mysql database utf-8 character-encoding

我在不同的服务器上有两个MySql数据库。

我正在将数据库1中的内容复制到数据库2。

数据库1

包含UTF8_unicode_ci中的所有内容 通过php连接是使用set_charset(utf8)

完成的

数据库2

与1相同

复制

我正在将内容从DATABASE 1复制到DATABASE 2,如下所示:

内容打印在文件 JSONfile.php 中,其中包含header('Content-type: application/json; charset=utf-8')和php json_encode()

使用file_get_contents(JSONfile.php)和`json_decode()``来获取内容。

然后保存到 DATABASE 2

Sidenote :我没有其他方法可以在我正在使用的服务器上复制内容。不允许远程连接。

问题:

当我从 DATABASE 2 中检索数据并显示它们时(总是使用meta charset utf8),似乎出现了一些奇怪的符号,如下所示:

... autorizarlarestauracióndelapinturaâLaInmaculadaâdeFran ...

注意:此字符串上的mb_detect_encoding()返回:UTF-8

只是尝试一下,我做了utf8_decode()并且进入了:

...larestauracióndelapintura LaInmaculada de...

其中一些修复了它并将奇怪与非奇怪混合在一起。

所以,某处肯定会有错误。

想知道错误吗?

编辑: - 数据库1中的内容来源 -

数据库1中的所有内容都是不同网站上的SCRAPE的结果 所有的擦除都是用html meta charset utf8打开网站完成的 有些消息来源有& Xacute;实体,有些则没有。

编辑2

数据库1

上转换为十六进制

Después de dos - > 4465737075c3a97320646520646f73

数据库2

上转换为十六进制

Después de dos - > 4465737075c3a97320646520646f73 (与上述相同)

所以问题不在于从一个数据库复制到另一个数据库。

我一直在调查,有一件非常奇怪的事情。在数据库(两者都有)上,当我通过phpMyAdmin访问时,有一些字段显示正确,如“camión”。但是在有问题的字段上显示编码,例如:Después

我不知道phpMyAdmin是否应该显示utf8表单或人类可读的表单。但是,同一个表格的字段之间的这种差异肯定是找到问题的大门。

SHOW CREATE TABLE返回:

CREATE TABLE `contents_data` (
`id` bigint(20) unsigned NOT NULL,
 `title` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
 `main_img` varchar(250) COLLATE utf8_unicode_ci NOT NULL,
 `data` text COLLATE utf8_unicode_ci NOT NULL,
 PRIMARY KEY (`id`),
 CONSTRAINT `ContentsDataIdFK` FOREIGN KEY (`id`) REFERENCES `contents` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

修改

使用字符串“Alcázar”对字段执行col(HEX)返回“416c63e17a6172”

非常好奇事情:

在上面右边的表格中,字段VARCHAR对重音符号进行编码,字段TEXT在所有行中给出了麻烦!

More infos: See the change in accents, for fields VARCHAR and TEXT

列是:“VARCHAR”和“TEXT”(请参阅上面的CREATE TABLE CODE上的更多信息)

注意:无论刮擦的来源如何,每一行都会发生同样的事情。

1 个答案:

答案 0 :(得分:1)

set_charset设置为(或默认为)latin1并且列的定义为CHARACTER SET latin1时,您可能会存储“o-acute”。

案例1 C3B3(o-acute的utf8十六进制)转换为latin1中的Ã(十六进制C3)和latin1中的B3 )。

SELECT col, HEX(col) ...看看现在有什么。同时SHOW CREATE TABLE获取CHARACTER SET

修改)在这种情况下,执行2-step ALTER,类似

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

其中长度足够大而另一个...还有其他任何内容(NULL等)已经在列上。

同样,TEXT - > BLOB - > TEXT

如果col位于任何索引中,您可能希望第一个DROP INDEX中的ALTER和第二个中的ADD INDEX。 (这是为了提高效率,并可能避免索引限制。)

案例2 或者它可能是“双重编码” - HEX不会是C3B3,而是更长的时间。

一旦确定了它是哪种情况,我们就可以讨论如何处理它。

Blog with further discussion