0

nvarchar(max) 型の mydata というフィールドを持つテーブルがあります。これには、é á ñ などの文字が含まれます。データは Java (Spring) を使用して抽出されます。Java アプリケーションは、要求と応答に utf-8 を使用しています。

単純な選択を実行すると、特殊文字が正しく表示されます。

Select myData from myTable

nvarchar を受け取って返す単純な SQL 関数があります。

CREATE function getIt (@mydata nvarchar(max) )
returns nvarchar(max)
as
begin
    return @mydata;
end

関数を使用すると、特殊文字が表示されず、記号に置き換えられます。

Select dbo.getIt(myData) as myData from myTable

mySQL と Oracle を使用して同じプロセスをテストしました。この場合、SQL 関数は特殊文字を変更しません。Ubuntu Linux ボックスで Tomcat を使用しています。データベースは SQL Sever 2005 です。JDTS 1.3 を使用しています。

ご協力ありがとうございました。

補足説明

フィールド myData に ñ が含まれている場合、たとえば、これを実行する場合:

Select
myData,
dbo.getIt(myData) as myData2
from myTable

Web ページに表示される列の結果は ? ? になります。または � � NVarchar はデータを適切に保存していますが、何らかの理由で関数が何かを変更しています。エンコーディングに問題がある場合、どちらの場合も ñ が正しく表示されません。

4

2 に答える 2

1

問題が発生しました。

何らかの理由で、nvarchar への通常の選択は、JDBO によってタイプ (12) VARCHAR としてキャプチャされます。ただし、nvarchar も返す関数は、型 (-1) LONGVARCHAR としてキャプチャされます。

MySQL と Oracle は異なる方法で動作し、私の Java コードはもともとこのデータベース用でした。

もう 1 つの状況は、nVarchar(400) は型 (12) VARCHAR を返しますが、nVarchar(MAX) は型 (-1) LONGVARCHAR を返すというものです。

私のコードは、バイナリとしてすべての「LONG」値を処理し、SQL Server がこのループに入っていました。

@jlordo と @chooban に解決策を教えてくれてありがとう。

于 2013-01-08T14:52:14.667 に答える
0

それが Unicode 置換文字です。これは、データベースからのバイトを UTF-8 として解釈するようにアプリケーションに指示しているが、Latin-1 (または別の文字セット) を提供している場合に発生する可能性があります。nvarchar は、データが UTF-16 として保存されていることを意味していると思いますよね? 私はSQLサーバーにあまり慣れていません。

データベースへの接続を確立したら、接続のメタデータを解釈し、使用されている文字セットを確認します。

また、列に格納されているものを正確に確認する必要があります。MySQL では、16 進関数を使用してフィールド内のバイト数を正確に表示しましたが、SQL Server で同等のものが何であるかはわかりません。ただし、このページには、文字数とバイト数を比較するために使用できるLEN関数とDATALENGTH関数があることがわかります。MySQL の16 進関数に相当するものを見つけることは、間違いなく g への道です。

于 2013-01-08T08:18:10.397 に答える