【问题标题】:PHP convert string variable that comes as ASCII to UTF8_unicode_ci keeping national characters [closed]PHP将作为ASCII的字符串变量转换为UTF8_unicode_ci,保留国家字符[关闭]
【发布时间】: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_encodingutf8_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


【解决方案1】:

这是解决方案,我必须在控制器中添加 set utf8:

  $pdo = DB::connection('mysqlPDO')->getPdo();
  $pdo->exec("set names utf8");
  $stmt = $pdo->prepare("SELECT * FROM .... );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多