如何处理将UTF8编码的文件(代码页=65001)导入到SQL SERVER中

How to handle import of file with UTF-8 encoding, codepage = 65001, into SQL server(如何处理将UTF8编码的文件(代码页=65001)导入到SQL SERVER中)
本文介绍了如何处理将UTF8编码的文件(代码页=65001)导入到SQL SERVER中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在挪威,我们有3个非常令人讨厌的角色,æøaka,他们制造了各种各样的问题。自2008年以来,微软决定不再支持代码页65001。对于使用OPENROWSET(BULK)将UTF-8文件导入到SQL SERVER中并保留æøaka令牌的问题,我找到了一个可管理的解决方案。

我创建了一个PowerShell脚本,该脚本使用StreamReader和StreamWriter将文件从UTF-8转换为默认编码ANSI。

$filename = "C:TestUTF8_file.txt"
$outfile = "C:TestANSI_file.txt"
$reader = new-object System.IO.StreamReader($filename, [System.Text.Encoding]::GetEncoding(65001))
$stream = new-object System.IO.StreamWriter($outfile, $false, [System.Text.Encoding]::Default)

我在同一进程中剥离了文件的第一行,即标题行。

$i=1
while(($line = $reader.ReadLine()) -ne $null) {
    if($i -gt 1) {
        $stream.WriteLine($line)
    }
    $i++
}
$reader.Close()
$stream.Close()
然后,我可以使用OPENROWSET将ANSI文件导入到SQL服务器中,并在此过程中操作数据。使用代码页1252,它等于丹麦_挪威排序规则。

    insert into SomeDatabase.dbo.SomeTable
SELECT [companynumber]
, case [role] when 'Styreformann' then 'Styreleder' when 'Styrets leder' then 'Styreleder' else rolle end as 'role'
, case [representant] when 'Y' then '1' else '0' end as 'representant'
, left((RIGHT('0000'+ CONVERT(VARCHAR,postnr),5)),4) end as 'postnr' 
, income*1000 as income
, null as person2id 
FROM OPENROWSET( BULK 'C:TestANSI_file.txt', 
FORMATFILE = 'C:TestFormatBulkInsert_file.xml'
, CODEPAGE =1252
, ROWS_PER_BATCH = 50000    
) as v 

此方法确保了挪威令牌的正确显示。格式化文件如下所示:

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <RECORD>
    <FIELD ID="1" xsi:type="CharTerm" TERMINATOR=';"' />
    <FIELD ID="2" xsi:type="CharTerm" TERMINATOR='";"' />
    <FIELD ID="3" xsi:type="CharTerm" TERMINATOR='";"' />
    <FIELD ID="4" xsi:type="CharTerm" TERMINATOR='";' />
    <FIELD ID="5" xsi:type="CharTerm" TERMINATOR=';' />
    <FIELD ID="6" xsi:type="CharTerm" TERMINATOR='
' />
  </RECORD>
  <ROW>
    <COLUMN SOURCE="1" NAME="companynumber" xsi:type="SQLINT"/>
    <COLUMN SOURCE="2" NAME="role" xsi:type="SQLNVARCHAR"/>
    <COLUMN SOURCE="3" NAME="representant" xsi:type="SQLBIT"/>
    <COLUMN SOURCE="4" NAME="postnr" xsi:type="SQLNVARCHAR"/>
    <COLUMN SOURCE="5" NAME="income" xsi:type="SQLDECIMAL"/>
    <COLUMN SOURCE="6" NAME="person2id" xsi:type="SQLINT"/>
  </ROW>
</BCPFORMAT>

希望这对其他人有帮助,因为我花了相当多的时间在Google上搜索才找到解决这个问题的方法。

推荐答案

改为转换为UTF16。这是SQL Server的原生NCHAR格式,并允许完全表示Unicode值。

要执行此操作,您必须在格式化文件中指定SQLNCHAR或SQLNVARCHAR,并注意以下注意事项:

要使格式化文件使用Unicode字符数据文件,所有输入字段都必须是Unicode文本字符串(即固定大小或以字符结尾的Unicode字符串)。

  • http://msdn.microsoft.com/en-us/library/ms178129.aspx
另一种方法是将其作为二进制数据加载,并使用CONVERT函数将其从VARBINARY转换为NVARCHAR(即UTF-16),然后转换为所需的代码页,即VARCHAR

这篇关于如何处理将UTF8编码的文件(代码页=65001)导入到SQL SERVER中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Execute complex raw SQL query in EF6(在EF6中执行复杂的原始SQL查询)
Hibernate reactive No Vert.x context active in aws rds(AWS RDS中的休眠反应性非Vert.x上下文处于活动状态)
Bulk insert with mysql2 and NodeJs throws 500(使用mysql2和NodeJS的大容量插入抛出500)
Sort by ID DESC(按ID代码排序)
SSIS: Model design issue causing duplications - can two fact tables be connected?(SSIS:模型设计问题导致重复-两个事实表可以连接吗?)
SQL/MySQL: split a quantity value into multiple rows by date(SQL/MySQL:按日期将数量值拆分为多行)