2016-08-03 8 views
1

私は、Exchange Webサービスを使用して電子メールからテキストを取得し、データベースに追加しています。 、そして、文字列に追加の '?'が挿入されています。 SQL Serverで

$PropertySet = new-object Microsoft.Exchange.WebServices.Data.PropertySet(
    [Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties); 
$PropertySet.RequestedBodyType = [Microsoft.Exchange.WebServices.Data.BodyType]::Text; 

$email_obj = [Microsoft.Exchange.WebServices.Data.EmailMessage]::Bind($service,$itemID); 
$email_obj.Load($PropertySet); 

#getting rid of replies 
$Message = $email_obj.Body.Text -replace '\s+', ' ' 
if($Message -like "* From: *"){ 
    $Message = ($Message -split " From: ")[0] 
} 
if($Message.IndexOf('_') -ne (-1)){ 
    $Message = $Message.Remove($Message.IndexOf('_')) 
} 

私は、SQL Serverで電子メールの本文を挿入します:だから私はこのように起動

$query = "INSERT INTO DB.Table ([ID],[Message],[Sender],[Recipient],[TimeStamp]) 
    VALUES ($ID,'$Message','$Sender','$Recipient',{0})" -f (Get-TimeStamp) 
Invoke-Sqlcmd -Query $query -ServerInstance $server 

をしかしINSERTはメッセージである文字列の前に?を追加します。 を実行する前に文字列の書式を設定しようとしましたが、それは役に立ちませんでした。 \n\r\t、または\sのような隠し文字が見つかりません。
電子メールの本文から取得した文字列のみがこの結果を生成します。

+2

文字列のchar単位の16進値のダンプを行います。 '? 'は単に「不明な文字」を意味する可能性があります –

+3

あなたのメッセージ文字列はUTF-8であり、データベースフィールドは(nvarcharではなくvarchar)そうではありません。 –

+0

文字列にUnicodeデータがありますが、あなたの列はvarcharです(@TonPlooijが示唆しているように)。面白い私は今日、これについて今日ブログしています:http://blogs.sqlsentry.com/aaronbertrand/backtobasics-unicode/ –

答えて

1

解決策は誰もが言ったようにデータフォーマットと関係があります。列はnvarcharであり、挿入しようとしていた文字列がどのデータ形式であるかはわかりませんが、時にはunknown charactersが1つ以上あります。テーブルにINSERTをしながらこの問題を解決するには、ちょうどこのように、N接頭辞を追加しました:

$query = "INSERT INTO DB.Table ([ID],[Message],[Sender],[Recipient],[TimeStamp]) 
        VALUES ($ID,N'$Message','$Sender','$Recipient',{0})" -f (Get-TimeStamp) 
Invoke-Sqlcmd -Query $query -ServerInstance $server 

This article @AaronBertrandからSQLでデータ形式を説明しています。

関連する問題