gpt4 book ai didi

mysql - 修复 MySQL 转储中的错误编码字符

转载 作者:行者123 更新时间:2023-12-05 05:55:34 27 4
gpt4 key购买 nike

我必须恢复使用以下脚本在 PowerShell 中创建的 MySQL 5.6 转储:

cd "C:\Program Files\MySQL\MySQL Server 5.6\bin"
.\mysqldump.exe --defaults-extra-file=C:\backups\script.cnf -h 127.0.0.1 my_base > C:\backups\dump.sql

不幸的是,转储文件包含错误的编码字符(├®代表é,├á代表à,├┤代表ô等)。
转储文件编码为“UTF-16 LE BOM”(according to Notepad++)。
下面是一个示例:

-- MySQL dump 10.13  Distrib 5.6.35, for Win64 (x86_64)
--
-- Host: 127.0.0.1 Database: my_base
-- ------------------------------------------------------
-- Server version 5.6.35-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `my_table`
--

DROP TABLE IF EXISTS `my_table`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `my_table` (
`code` varchar(100) NOT NULL DEFAULT '',
PRIMARY KEY (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `my_table`
--

LOCK TABLES `my_table` WRITE;
/*!40000 ALTER TABLE `my_table` DISABLE KEYS */;
INSERT INTO `my_table` VALUES ('├® ├á ├┤');
/*!40000 ALTER TABLE `my_table` ENABLE KEYS */;
UNLOCK TABLES;

我知道用于转储数据库的命令在 Windows 上很乱,但我别无选择:我无法获得新的转储,我必须处理它。
有没有办法修复文件以获得正确的数据?
如果没有,我准备好寻找并替换!

最佳答案

您可以使用 --result-file 选项(参见 docs )绕过您的问题,这使得 mysqldump 本身写入文件:

.\mysqldump.exe --result-file=C:\backups\dump.sql --defaults-extra-file=C:\backups\script.cnf -h 127.0.0.1 my_base

至于你尝试了什么:

有两个问题(适用于 PowerShell 7.2):

  • 即使您使用 > 将外部程序输出的数据发送到文件,PowerShell 也会首先使用字符将数据解码为 .NET 字符串编码存储在 [Console]::OutputEncoding 中,(不幸的是,从 PowerShell 7.2 开始)默认为系统的事件 OEM 代码页。

    • 听起来 mysqldump.exe 输出实际上是 UTF-8 编码的,因此导致 PowerShell 误解输出。

    • (暂时)设置 [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new() 将纠正这种误解。

  • > 实际上是 Out-File 的别名cmdlet,它在输出上使用默认字符编码,这与原始编码无关。在 Windows PowerShell 中,默认编码是 UTF-16LE(“Unicode”)。 (幸运的是,PowerShell (Core) 7+ 现在在所有 cmdlet 中始终默认为无 BOM 的 UTF-8)。

    • 要控制输出文件的字符编码,而不是使用 >,通过管道传输到 Out-File - 或者,最好是从外部输出的纯文本数据程序始终在 PowerShell 中 - Set-Content - 并将所需的编码传递给 -Encoding 参数。

有关详细背景信息,请参阅 this answer .

关于mysql - 修复 MySQL 转储中的错误编码字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69455947/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com