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才能正确存储扩展字符:
- 可以给目标字段单独设置支持UTF-8的排序规则(SQL Server 2016及以上支持):
ALTER TABLE 你的目标表 ALTER COLUMN 目标varchar字段 VARCHAR(255) COLLATE Latin1_General_100_CI_AS_SC_UTF8 - 也可以直接将字段类型改为
nvarchar,天然支持Unicode字符,无需额外设置排序规则。
关键提醒
- 确认你的CSV文件确实是UTF-8编码(带BOM或无BOM都可以,上述代码都能处理)
- 不要尝试给
SqlBulkCopy对象设置不存在的Codepage属性,所有编码处理都要在读取CSV阶段完成
内容的提问来源于stack exchange,提问作者Bruce Foxton
相关产品推荐
相关产品推荐

