【问题标题】:SQL Server bulk insert special characters / Unicode from C# generated CSVSQL Server 从 C# 生成的 CSV 批量插入特殊字符/Unicode
【发布时间】:2020-04-01 22:17:17
【问题描述】:

场景: 从 C# 生成的 CSV 文本文件,将使用 BULK INSERT 导入 SQL Server 数据库。某些字段包含特殊字符(也称为 Unicode)。

问题: 特殊字符在文本文件中正确显示,但未正确保存在数据库中。

编辑:正确文本示例为“Khālid Muḥammad ʻAlī al-Ḥājj”,错误文本示例为“Kha¯lid Muh?ammad ?Ali¯ al-H?a¯jj”。

【问题讨论】:

  • 您的问题是什么?您说没有“正确”保存,这是什么意思?它们是错误的字符吗,它们是否看起来很奇怪,它们是否完全丢失(那里没有字符),或者其他什么? “未正确保存”是什么意思?
  • 那么当它不工作时你使用的代码是什么?是的,你在这里写了一个答案,但它并没有真正说明你最初遇到的问题是什么。没有复制问题的代码,这意味着未来的读者不会知道这个答案是否与他们有关,因为他们不知道导致您的问题的代码是什么。

标签: c# sql sql-server unicode


【解决方案1】:

我从几个来源拼凑了这个问题的答案,所以这里是一个地方的全部内容。

(1) 文本文件必须标记为 Unicode 文件。

StreamWriter writer = new StreamWriter(fileName, append: false, encoding: Encoding.Unicode);

(2) 数据库列必须使用 Unicode 数据类型。例如,用 NVARCHAR 代替 VARCHAR。使用以“N”开头的数据类型之一。

旁注:您可以通过在 T-SQL 中使用 N 前缀将字符串文字标记为 Unicode 字符串。

INSERT INTO myTable (Name) VALUES (N'special characters');

(3) 在 BULK INSERT 命令中指定 DATAFILETYPE='widechar'。 (如果文件没有标记为 Unicode,这将引发错误。)

BULK INSERT dbo.myTable FROM 'C:\path\fileName.csv' 
WITH (DATAFILETYPE ='widechar', FIRSTROW=2, FIELDTERMINATOR='|', ROWTERMINATOR='\n');

(4) 使用数据库排序规则 SQL_Latin1_General_CP1_CI_AS。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多