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

PowerShell中使用SqlBulkCopy指定代码页/编码的语法求助

解决PowerShell导入含扩展字符CSV到SQL Server的编码问题
  • 你碰到的语法错误根源是SqlBulkCopy对象根本没有Codepage属性,直接给它赋值肯定会失败。要正确处理带变音符号、㎡这类扩展字符的UTF-8(代码页65001)CSV,得从读取CSV的环节就指定编码,再把处理好的数据源传给SqlBulkCopy。

方案1:修改CSV读取逻辑指定UTF-8编码

如果你的脚本用的是TextFieldParser(多数高性能CSV读取脚本会用这个),修改读取部分的代码:

$csvPath = "你的CSV文件路径"
$codepage = 65001 # UTF-8编码对应的代码页

# 初始化TextFieldParser并指定编码
$reader = New-Object Microsoft.VisualBasic.FileIO.TextFieldParser($csvPath)
$reader.SetDelimiters(',')
$reader.HasFieldsEnclosedInQuotes = $true
$reader.Encoding = [System.Text.Encoding]::GetEncoding($codepage)

# 后续的读取、数据映射、SqlBulkCopy逻辑保持不变

如果脚本用的是StreamReader读取CSV,同样在初始化时指定编码:

$streamReader = New-Object System.IO.StreamReader($csvPath, [System.Text.Encoding]::UTF8)
# 或者用代码页指定:[System.Text.Encoding]::GetEncoding(65001)

方案2:确保SQL字段兼容UTF-8

即使读取环节编码正确,SQL Server的varchar字段也需要支持UTF-8才能正确存储扩展字符:

  1. 可以给目标字段单独设置支持UTF-8的排序规则(SQL Server 2016及以上支持):
    ALTER TABLE 你的目标表 
    ALTER COLUMN 目标varchar字段 VARCHAR(255) COLLATE Latin1_General_100_CI_AS_SC_UTF8
    
  2. 也可以直接将字段类型改为nvarchar,天然支持Unicode字符,无需额外设置排序规则。

关键提醒

  • 确认你的CSV文件确实是UTF-8编码(带BOM或无BOM都可以,上述代码都能处理)
  • 不要尝试给SqlBulkCopy对象设置不存在的Codepage属性,所有编码处理都要在读取CSV阶段完成

内容的提问来源于stack exchange,提问作者Bruce Foxton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:00:07