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_encodingutf8_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 .... );