TSQL从文件读取到varchar / nvarhar错误

时间:2014-02-03 20:49:34

标签: sql-server tsql sql-server-2008-r2 varchar nvarchar

因此,我决定阅读文本文件并使用TSQL和Microsoft SQL Server Management Studio 2008 R2将内容存储到NVARCHAR中。我在https://www.simple-talk.com/sql/t-sql-programming/the-tsql-of-text-files/

找到了一个例子

所以我用我的ABC.txt文件尝试了这个,其内容是:


  

ABCDEFGHIJKLMNOPQRSTUVWXYZ

     

ABCDEFGHIJKLMNOPQRSTUVWXYZ


当我第一次尝试将此文件的内容存储到@myString时,我使用了以下代码:

declare @myString nvarchar(max); 

Select @myString  = BulkColumn
from OPENROWSET(Bulk 'C:\Users\<myComputer'sNameHere>\Documents\How2\FilesForTestingStuff\ABC.txt', SINGLE_BLOB) as x 
print @myString;

  

当我打印字符串时,我将此作为输出:

     

䉁䑃䙅䡇䩉䱋乍偏剑呓噕涂婙਍扡摣晥桧橩汫湭灯牱瑳癵硷穹


我将nvarchar更改为varchar,我获得了该文件的正确内容。

任何人都知道为什么会这样吗?除了nvarchar之外,除了varchar之外,我认为转换差异不大于nvarchar并且能够保存unicode字符。 另外,您通常如何尝试从文件中读取并将内容插入{{1}}?

1 个答案:

答案 0 :(得分:3)

我认为这取决于输入文件的编码。

您使用了SINGLEBLOB,根据MSDN,它会将数据作为varbinary(MAX)返回。您的文件可能使用非unicode编码保存,因此当将数据导入nvarchar列时,SQL会错误地解释它。更改类型允许正确读取字符。请尝试使用UTF-16对文件进行编码,并尝试将数据导入nvarchar(MAX)变量。

<强>更新

我尝试重新创建您描述的问题。我已经使用ANSI编码保存了一个文本文件,运行导入脚本并获得类似于您在问题中发布的输出。然后,我将文件转换为 UCS-2 Little Endian 编码,运行脚本后输出正确。

总结一下,如果您想使用SINGLEBLOB选项导入,只需将文件转换为数据即可使用 UCS-2 Little Endian 编码它应该与nvarchar SQL类型一起正常工作。

参考链接: