PHP 将以 ASCII 形式出现的字符串变量转换为 UTF8_unicode_ci 保留国家字符
PHP convert string variable that comes as ASCII to UTF8_unicode_ci keeping national characters
在 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
不起作用。波兰语字母,如 ł、ę、ą 等在数据库中保存为 ?
Table 在第二个数据库中看起来像:
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->街道。 ''。 mb_detect_encoding($importDTO->街道),
我得到结果:Ja?minowa ASCII
这是解决方案,我必须在控制器中添加 set utf8:
$pdo = DB::connection('mysqlPDO')->getPdo();
$pdo->exec("set names utf8");
$stmt = $pdo->prepare("SELECT * FROM .... );
在 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
不起作用。波兰语字母,如 ł、ę、ą 等在数据库中保存为 ?
Table 在第二个数据库中看起来像:
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->街道。 ''。 mb_detect_encoding($importDTO->街道),
我得到结果:Ja?minowa ASCII
这是解决方案,我必须在控制器中添加 set utf8:
$pdo = DB::connection('mysqlPDO')->getPdo();
$pdo->exec("set names utf8");
$stmt = $pdo->prepare("SELECT * FROM .... );