Transact-SQLで日本語を(2バイト文字)を含むデータの扱い

プログラミング SQL Server

Transact-SQLで日本語を(2バイト文字)を含むデータをそのままSUBSTRING()すると、ずれて取得されるようです。
これで半日潰しました。

Declare @strWork [varchar](256)
Declare @strtmp1 [varchar](40)
Declare @strtmp2 [varchar](40)

Select @strtmp1 = SUBSTRING( @strWork, 10, 40 )
Select @strtmp2 = SUBSTRING( @strWork, 50, 40 )

strTmp2に内容が予想よりずれて取得されます。

ずれないように取得するには以下のようにCAST()してから取得します。

Declare @strWork [varchar](256)
Declare @strtmp1 [varchar](40)
Declare @strtmp2 [varchar](40)

Select @strtmp1 = SUBSTRING( CAST( @strWork AS Text), 10, 40 )
Select @strtmp2 = SUBSTRING( CAST( @strWork AS Text), 50, 40 )

また、日本語(2バイト文字)を含むデータ以降はすべてCAST()して取得する必要があります。

文字数ではなくバイト数で取得する必要があるようです。

タイトルとURLをコピーしました