3

SQL Server での Unicode の気まぐれ (varchar と nvarchar など) を理解しています。Unicode データの格納と取得に問題はありません。ただし、これらのフィールドの非 ASCII 文字は異常と見なされるため、varchar として保持することを選択したフィールドがいくつかあります。

Unicode 文字がこれらの非 Unicode フィールドの 1 つになると、SQL Server はそれを疑問符 "?" に変換します。しかし、それらのフィールドでは疑問符が有効な文字であるため、置換がいつ発生したかを判断するのが難しい場合があります。

私の質問: SQL Server で疑問符ではなく別の置換文字を使用することはできますか? たとえば、アンダースコアまたは空の文字列 ('') でさえありますか?

4

3 に答える 3

1

そうです、ASCII に相当するものを持たない Unicode 文字は、varchar に入れるとデータが失われ、疑問符が残ります。

select ascii(cast(nchar(1000) as varchar));

R. Martinho Fernandes に同意します。アプリケーション レイヤーでこれを解決する必要があります。アプリで、値が 255 を超える 2 バイトの Unicode ペアを必要なものに置き換えることができます。おそらく、アプリケーション層のエンコーディングを変更して、ASCII および拡張 ASCII データのみを受け入れるようにすることができます。しかし、この場合、データ レイヤーを失敗させようとするのは、「データ フィールドは 'M' または 'F' しか受け入れない」と言っているようなものです。ユーザーが「Z」を送信したときに、データベースがエラーを出すのはなぜですか?」

于 2013-03-28T17:09:46.497 に答える
1

退屈だったから。これはアプリケーションでは役に立たないだろうとほぼ確信していますが、あなたが求めたことは実行します。本当にしたい場合は、これを使用して関数を作成できます...

Declare @Nvarchar Nvarchar(25) = N'Hɶppy',
        @NVbinary Varchar(128),
        @parse Int = 3,
        @NVunit Varchar(4),
        @result Varchar(64) = '0x',
        @SQL Nvarchar(Max);

Select  @NVbinary = master.sys.fn_varbintohexstr(Convert(Varbinary(128),@Nvarchar))

While (@parse < Len(@NVbinary))
Begin
        Select  @NVunit = Substring(@NVbinary,@parse,4),
                @parse = @parse + 4


        If      Substring(@NVunit,3,2) = '00'
        Begin
                Set     @result = @result + Substring(@NVunit,1,2)
        End
        Else
        Begin
                Set     @result = @result + '22' -- 22 is the hex value for quotation mark; Use Select Convert(Varbinary(8),'"') to get the value for whatever non-unicode character you want.
        End

End

Set     @SQL = 'Select Convert(Varchar(128),' + @result + '), ''' + @result + ''''

Select  @Nvarchar, @NVbinary
Exec    sp_executeSQL @SQL
于 2013-03-28T17:20:23.350 に答える
1

あなたの質問に対する率直な答えは、その文字を「設定」することはできないということです。他の人が示唆し、おそらくすでに知っているように、「特別な」varchar フィールドへの有効なデータをチェックする必要があります。

于 2013-03-28T17:38:29.897 に答える