Php 完全相同的MySQL表结构/数据,相同查询的结果不同

Php 完全相同的MySQL表结构/数据,相同查询的结果不同,php,mysql,sql,character-encoding,database-migration,Php,Mysql,Sql,Character Encoding,Database Migration,这是我的情况 我正在从一台服务器迁移到另一台服务器。作为其中的一部分,我将跨越数据库数据 迁移方法涉及在新服务器上运行相同的CREATETABLE查询,然后使用一系列INSERT命令逐行插入数据。这可能导致不同的数据,但是,使用CHECKSUM命令验证内容。在传输之后,在整个表上执行校验和,在隔离该行的新表上执行校验和,在应用左运算符截断字符串之后执行校验和。每次,新旧服务器之间的结果都是相同的,这表明原始数据在字节级别应该完全相同 CHECKSUM TABLE `test` 我检查了结构,它

这是我的情况

我正在从一台服务器迁移到另一台服务器。作为其中的一部分,我将跨越数据库数据

迁移方法涉及在新服务器上运行相同的CREATETABLE查询,然后使用一系列INSERT命令逐行插入数据。这可能导致不同的数据,但是,使用CHECKSUM命令验证内容。在传输之后,在整个表上执行校验和,在隔离该行的新表上执行校验和,在应用左运算符截断字符串之后执行校验和。每次,新旧服务器之间的结果都是相同的,这表明原始数据在字节级别应该完全相同

CHECKSUM TABLE `test`
我检查了结构,它也完全一样

SHOW CREATE TABLE `test`
结构如下:

CREATE TABLE test ( item varchar(32) COLLATE utf8_unicode_ci NOT NULL, amount mediumint(5) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
该字段的类型为:

`item` varchar(32) COLLATE utf8_unicode_ci NOT NULL
以下是我在PHP中的连接代码:

$sql = new mysqli($db_host, $db_user, $db_pass, $db_name);
if ($sql->connect_error) {
  die('Connect Error ('.$sql->connect_errno.') '.$sql->connect_error);
}
当我用一个简单的查询在PHP中检索数据时:

SELECT * FROM `test`
数据显示如下:

§lO

在旧服务器/主机上,我获得以下原始字节序列:

Decimal: -194-167-108-79-
HEX: -C2-A7-6C-4F-
在新服务器上,我在开始时得到了几个额外的字节:

Decimal: -195-130-194-167-108-79-
HEX: -C3-82-C2-A7-6C-4F-
为什么完全相同的原始数据、表结构和查询会在两台服务器之间返回不同的结果?我应该做些什么来确保将来的结果尽可能一致?

的§lO
§lO
的“Mojibake”。我认为后者(3个字符)是“正确的”

原始数据如下所示(在两种情况下,当我显示它时)

是假的,因为用于显示它的技术可能会弄乱编码

因为这3个字符变成了4,然后变成了6,所以您可能有“双重编码”

本文讨论了“双重编码”是如何发生的:

如果您提供更多信息(
CREATE TABLE
、十六进制、数据迁移方法等),我们可能会进一步解决您的问题

更多

使用mysqli时,请执行
$sql->set_字符集('utf8')

(十六进制证实了我的分析。)

迁移方法涉及在新服务器上运行相同的创建表查询

它前面是否有一些字符集设置,如在
mysqldump

然后使用一系列INSERT命令逐行插入数据

你能得到文件中某个重音字符的十六进制数吗

。。。校验和

好吧,同样的情况排除了一件事

校验和是在。。。已隔离该行的新表

你是怎么做到的<代码>选择
行可能修改了文本,从而使测试无效

指示原始数据在字节级别应该完全相同

CHECKSUM TABLE `test`
为了检查表中的数据,
选择十六进制(col).
是绕过所有可能发生的字符集转换的唯一方法。请为具有非ascii字符的某些列提供十六进制(如给出的示例)。并对十六进制输出进行校验和


并提供
显示变量,如“char%”

检查数据库上的字符集,只需在两个上运行`SELECT default\u character\u set\u name FROM information\u schema.SCHEMATA WHERE schema\u name=“database\u name”`谢谢您的帮助。在这两种情况下,我收到的结果都是“默认字符集名称”为“utf8”。您可以发布该表的创建表吗?在这两种情况下,“创建表
测试
varchar(32)COLLATE utf8\u unicode\u ci非空,
金额
mediumint(5)非空)引擎=MyISAM默认字符集=utf8\u unicode\u ci”
latin1
可能涉及某些方面,例如连接参数。非常感谢您的帮助。我已将你要求的所有细节添加到问题中。我正在阅读你提供的另一个问题。我感谢你的帮助。“请告诉我是否还有其他有用的细节。@azoundria-我补充了更多。非常感谢您的帮助。”。发生的事情是,我只是在迁移过程中超时,旧的web主机帐户现在处于脱机状态,因此我无法知道差异。除了谢谢,我没有别的话要说了。