【发布时间】:2021-08-19 21:27:23
【问题描述】:
在 Laravel 中,我必须将数据从 MySql 上的一个数据库迁移到另一个数据库。 来自第一个 MySQl 的数据以 ASCII 形式出现并具有国家字符。我必须将这些数据保存在第二个 MySql 数据库中。第二个数据库有 UTF8_unicode_ci 编码的列。 从第一个数据库获取数据的代码:
$pdo = DB::connection('mysqlPDO')->getPdo();
$stmt = $pdo->prepare("SELECT * FROM `form_data` WHERE sent_to_pbox = 0 AND LIMIT 1");
$stmt->execute();
$result = $stmt->fetchAll(\PDO::FETCH_ASSOC);
$stmt->closeCursor();
unset($stmt);
以及保存在第二个数据库中的代码:
$clientAddressEntity = ClientAddress::create([
'client_id' => $clientEntity->id,
'street' => mb_convert_encoding($importDTO->street, 'ASCII', 'UTF-8'),
'building_no' => utf8_encode($importDTO->building_no),
'post_code' => utf8_encode($importDTO->post_code),
'city' => utf8_encode($importDTO->city),
'country_id' => isset($countryEntity) ? $countryEntity->id : null,
]);
mb_convert_encoding 和 utf8_encode 不起作用。像 ł,ę,ą 等波兰语字母在数据库中保存为 ?
第二个数据库中的表如下所示:
CREATE TABLE `client_address` (
`id` int NOT NULL,
`client_id` int DEFAULT NULL,
`street` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`building_no` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`post_code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`city` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`country_id` int DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
当我添加时:
'street' => $importDTO->street 。 ' ' 。 mb_detect_encoding($importDTO->street),
我得到结果:Ja?minowa ASCII
【问题讨论】:
-
首先删除
utf8_encode()。这可能是您的问题的原因 -
您的连接字符集是否设置为
utf8mb4? -
ASCII,根据定义,没有“国家字符”。
-
我认为您的意思是旧的已弃用
utf8字符集而不是 ASCII。请确认您真正从哪个字符集迁移 -
另见数据库特定步骤here。确保连接到两台服务器的字符集与数据库使用的字符集匹配。
标签: php mysql laravel utf-8 character-encoding