【发布时间】:2020-03-12 17:09:22
【问题描述】:
这是我的情况。
我正在从一台服务器迁移到另一台服务器。作为其中的一部分,我正在跨数据库数据移动。
迁移方法涉及在新服务器上运行相同的 CREATE TABLE 查询,然后使用一系列 INSERT 命令逐行插入数据。这可能会导致不同的数据,但是,CHECKSUM 命令用于验证内容。 CHECKSUM 是在传输后对整个表、在隔离了该行的新表上以及在应用 LEFT 运算符截断字符串后进行的。每次,新旧服务器的结果都是相同的,这表明原始数据在字节级别上应该完全相同。
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`
数据显示如下:
§10
在旧服务器/主机上,我得到以下原始字节序列:
Decimal: -194-167-108-79-
HEX: -C2-A7-6C-4F-
在新服务器上,我在开头得到了几个额外的字节:
Decimal: -195-130-194-167-108-79-
HEX: -C3-82-C2-A7-6C-4F-
为什么完全相同的原始数据、表结构和查询会在两台服务器之间返回不同的结果?我应该怎么做才能确保将来的结果尽可能一致?
【问题讨论】:
-
检查数据库上的字符集,只需在两者上运行`SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = "database_name"`
-
感谢您的帮助。在这两种情况下,我收到的结果都是“DEFAULT_CHARACTER_SET_NAME”是“utf8”。
-
能否请您发布该表的创建表?
-
在这两种情况下 "CREATE TABLE
test(itemvarchar(32) COLLATE utf8_unicode_ci NOT NULL,amountmediumint(5) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci " -
latin1可能涉及到某处,例如 connection 参数。
标签: php mysql sql character-encoding database-migration