Sql server 为什么赢了';t红移接受我的固定宽度文本文件

Sql server 为什么赢了';t红移接受我的固定宽度文本文件,sql-server,powershell,sql-server-2008-r2,streamwriter,Sql Server,Powershell,Sql Server 2008 R2,Streamwriter,我正在从SQLServer2008R2数据库中读取一个varchar(500)列,以便通过一个固定宽度的文本文件导入到Redshift中 为了将记录下拉到固定宽度的文件中,我首先使用StringBuilder一次写出一块文本。我使用了AppendFormat和对齐说明符来对齐不同的记录。在某些情况下,每隔400k行,我会将StringBuilder的内容写入StreamWriter以写入磁盘 我注意到,当我尝试将文件加载到Redshift时,文本出现了问题,由于额外的列,上载到Reshift失败

我正在从SQLServer2008R2数据库中读取一个
varchar(500)
列,以便通过一个固定宽度的文本文件导入到Redshift中

为了将记录下拉到固定宽度的文件中,我首先使用
StringBuilder
一次写出一块文本。我使用了
AppendFormat
和对齐说明符来对齐不同的记录。在某些情况下,每隔400k行,我会将
StringBuilder
的内容写入
StreamWriter
以写入磁盘

我注意到,当我尝试将文件加载到Redshift时,文本出现了问题,由于额外的列,上载到Reshift失败(列数超过了我的固定宽度规范所能容纳的列数)

当我针对一个常规字符串测试
StringBuilder
时,宽度与我想要匹配的匹配,500个字符

当我尝试将记录写入磁盘时,出现了差异。当我使用
WriteLineformat
StreamWriter对象将上述数据库列写入磁盘时,我一直遇到同样的问题

数据库的排序规则是
SQL\u Latin1\u General\u CP1\u CI\u AS
。我知道数据库中的字符串会被数据库排序规则转换为UTF-16。我认为这没有问题,正如我在上面执行的测试所述。我认为我遇到的问题是以UTF-16格式获取字符串并使用
StreamWriter
将其写入磁盘

除了换行符或回车符之外,我可以从数据库字段中期待任何类型的字符。我非常确信,在使用TSQL函数
Ltrim
Rtrim
组合将空格放入数据库列之前,会对空格进行修剪

编辑:以下是我在Powershell中使用的代码

$dw = new-object System.Data.SqlClient.SqlConnection("<connection string details>")
$dw.open()
$reader = (new-object System.Data.SqlClient.Sqlcommand("select email from emails",$dw)).ExecuteReader()
$writer = new-object system.IO.StreamWriter("C:\Emails.txt",[System.Text.Encoding]::UTF8)
while($reader.read())
{
    $writer.writelineformat("{0,-500}",$reader["email"])
}
$writer.close()
$reader.close()

文件中的内容绝对是UTF-8。中的所有行尾。我的主要问题似乎是红移对固定宽度的文件使用多字节字符。

我怀疑这个问题是由于默认情况下使用UTF-8造成的,因此在某些情况下,由于UTF-8是可变宽度的,所以您将获得双字节字符


尝试使用,它将匹配您的数据库编码,具有支持编码的重载

只是为了让看到这个的人都能理解。我的问题是红移。我注意到的一点是,该服务似乎在处理fixedwidth文件时存在问题。这似乎是亚马逊特有的,因为运行红移的底层系统是ParAccel。我过去在使用Fixedwidth文件时遇到过问题。我已经确认,在S3复制命令的固定宽度版本中,红移接受多字节字符存在问题。

请显示您的代码。我们不会在不知道什么东西坏了的情况下猜测如何修复。我很感激大卫的建议。我刚从AWS Redshift中调出文档,它们只支持将文件加载到使用UTF-8排序规则的文本数据库中。我非常肯定您是正确的,因为使用unicode(我相信.Net指的是UTF-16)不会有任何问题,因为不会涉及任何转换。谢谢你。
get-content -encoding utf8