You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中Sqlite两种.dump调用方式UTF-8字符处理差异问询

两种SQLite导出命令的核心差异与乱码原因

核心差异

  • 第一种方式:导出逻辑完全在sqlite3进程内部完成,通过sqlite3内置的.output命令直接将dump结果写入目标文件,整个过程不经过PowerShell的管道传递,没有中间层的编码转换。sqlite3默认输出UTF-8编码的文本,直接落盘时所有Unicode字符可以原样保留。
  • 第二种方式:sqlite3将dump结果输出到标准输出流(stdout),经过PowerShell管道传递给Set-Content命令后再写入文件,传输过程会经过PowerShell的编码转换逻辑,编码不匹配时就会出现乱码。

乱码根因

你看到的GÇÖ是典型的UTF-8字符被错误使用Windows-1252(西欧编码)解码再重编码的结果:右单引号’的UTF-8编码为0xE2 0x80 0x99,这三个字节按Windows-1252解码就会对应G、Ç、Ö三个字符。
第二种方式的编码错误出在两个节点:

  1. PowerShell接收外部程序(sqlite3)的标准输出时,默认使用系统默认ANSI编码(简体中文系统为GBK、西欧系统为Windows-1252)解码,但sqlite3的标准输出是UTF-8编码,解码逻辑不匹配直接导致字符识别错误。
  2. 即使第一步解码正常,Set-Content默认写入文件的编码也是系统默认ANSI编码,不是UTF-8,二次编码转换会进一步破坏Unicode字符。

第二种方式的修复方案

要保留管道写法的灵活性,只需要显式指定全链路的编码为UTF-8即可:

# 临时修改PowerShell接收外部程序输出的编码为UTF-8
$OutputEncoding = [Console]::OutputEncoding = [Text.UTF8Encoding]::new($false)
# 写入文件时显式指定UTF-8编码
sqlite3 database.db .dump | Set-Content output.sql -Encoding UTF8

如果需要生成无BOM的UTF-8文件(绝大多数数据库导入工具的默认要求),PowerShell 7+可直接使用-Encoding UTF8NoBOM参数;Windows PowerShell 5.1可以使用以下写法:

$OutputEncoding = [Console]::OutputEncoding = [Text.UTF8Encoding]::new($false)
$dumpContent = sqlite3 database.db .dump
[IO.File]::WriteAllText("output.sql", $dumpContent, [Text.UTF8Encoding]::new($false))

内容的提问来源于stack exchange,提问作者Kamalpreet Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:48:02