2017-04-16 16 views
1

SQL Serverに本文を格納しています。SQL ServerでUnicodeテキストを検出する

一部の本文には、SQL Server内のVARCHAR列に格納するときに失われるUnicode文字が含まれています。

格納されるテキスト本文のほんの一部にNVARCHARの列が必要なので、VARCHARのテキストとNVARCHARのテキストの2つの列を作成することにしました。この方法では、テキストのUnicode本体をNVARCHAR列に格納し、残りをVARCHAR列に格納するだけで、スペースを節約できます。

質問:テキストの本文にUnicode文字が含まれているかどうかを検出して、それを格納するのに最適な列を判断できるようにするにはどうすればよいですか?

答えて

2

照合のコードページで使用可能な256文字を特定し、その文字セット内に含まれていない文字を調べるか、varcharにキャストしてから、nvarcharオリジナルと比較することができます。

あなたが最初のアプローチは

DECLARE @String NVARCHAR(MAX) = N'൯' 

SELECT CASE 
     WHEN @String LIKE '%[^' COLLATE Latin1_General_100_BIN + CHAR(0) + '-' + CHAR(255) + ']%' 
      THEN 'varchar not OK' 
     ELSE 'varchar OK' 
     END 

及び第二のアプローチで行うことができ、コードページ1252を使用している場合...ところで

DECLARE @String NVARCHAR(MAX) = N'൯' 

SELECT CASE 
     WHEN CAST(@String AS VARCHAR(MAX)) = @String 
      THEN 'varchar OK' 
     ELSE 'varchar not OK' 
     END 

:あなたが行圧縮を使用する場合も取得しますUnicode圧縮がスローされ、これはこれの必要性をほとんど否定します。

+0

圧縮の使用は好ましいオプションのように聞こえますが、ネイティブSQL圧縮を使用してフィールドを圧縮できる程度には限界があると思います。 SQL CLRライブラリを使用してgzipなどの圧縮を実装する可能性があります。 –

+0

@EliPerpinyalの行とページの圧縮([unicode圧縮](https://technet.microsoft.com/en-us/library/ee240835(v = sql.110).aspx)を含む)は、行に格納されたデータにのみ適用されますラージオブジェクトデータではありません。 SQL Server 2016には、GZIP圧縮用のCOMPRESS関数が組み込まれています。 –

関連する問題