如何将latin1_swedish_ci字符串转为印地语文本并存储为utf8_unicode_ci
解决latin1_swedish_ci转utf8_unicode_ci的印地语乱码问题
单条字符串修复方法
你的示例乱码是因为UTF-8编码的印地语文本被错误以latin1(ISO-8859-1)格式存储导致的,通过编码转换即可还原:
PHP代码实现
$latin1_str = "अपने पà¥à¤¯à¤¾à¤° से अपनी दिल की बात कहेà¤"; // 方法1:用mb_convert_encoding $utf8_str = mb_convert_encoding($latin1_str, 'UTF-8', 'ISO-8859-1'); // 方法2:用iconv $utf8_str = iconv('ISO-8859-1', 'UTF-8', $latin1_str);
还原后正确文本:अपने प्यार से अपनी दिल की बात कहें(注:示例字符串末尾缺失字符,此为补全语义后的完整结果)
百万级数据库批量转换方案
方案1:SQL直接转换(高效推荐)
直接通过SQL修改表/字段的字符集,需按以下步骤操作(避免直接转换导致乱码恶化):
- 先备份数据库,防止操作失误丢失数据。
- 将目标表/字段转换为binary字符集,保留原始字节:
-- 整张表转换 ALTER TABLE your_table_name CONVERT TO CHARACTER SET binary; -- 单个字段转换 ALTER TABLE your_table_name MODIFY COLUMN your_column_name TEXT CHARACTER SET binary; - 再转换为utf8mb4(兼容所有印地语字符),排序规则设为utf8_unicode_ci:
-- 整张表转换 ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8_unicode_ci; -- 单个字段转换 ALTER TABLE your_table_name MODIFY COLUMN your_column_name TEXT CHARACTER SET utf8mb4 COLLATE utf8_unicode_ci;
方案2:程序批量处理(适合需要额外逻辑的场景)
如果需要通过代码处理,可分批次读写避免内存溢出,以PHP为例:
// 连接数据库(指定latin1编码读取原始数据) $pdo = new PDO('mysql:host=localhost;dbname=your_db;charset=latin1', 'username', 'password'); $pdo->exec("SET NAMES latin1"); $batchSize = 1000; // 每次处理1000条 $offset = 0; while (true) { // 分批次查询数据 $stmt = $pdo->prepare("SELECT id, target_column FROM your_table LIMIT :offset, :batchSize"); $stmt->bindParam(':offset', $offset, PDO::PARAM_INT); $stmt->bindParam(':batchSize', $batchSize, PDO::PARAM_INT); $stmt->execute(); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); if (empty($rows)) break; // 批量更新转换后的数据 $updateStmt = $pdo->prepare("UPDATE your_table SET target_column = :utf8_text WHERE id = :id"); foreach ($rows as $row) { $utf8Text = mb_convert_encoding($row['target_column'], 'UTF-8', 'ISO-8859-1'); $updateStmt->bindParam(':utf8_text', $utf8Text); $updateStmt->bindParam(':id', $row['id']); $updateStmt->execute(); } $offset += $batchSize; }
后续注意事项
- 转换完成后随机抽查数据,验证印地语文本是否正确显示。
- 后续数据库连接需指定utf8mb4编码,避免再次出现乱码问题。
内容的提问来源于stack exchange,提问作者Ajay Chauhan
相关产品推荐
相关产品推荐

