我在不同的服务器上有两个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在所有行中给出了麻烦!
列是:“VARCHAR”和“TEXT”(请参阅上面的CREATE TABLE CODE上的更多信息)
注意:无论刮擦的来源如何,每一行都会发生同样的事情。
答案 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,而是更长的时间。
一旦确定了它是哪种情况,我们就可以讨论如何处理它。