【SQL Server】日本語環境ではない環境でバイト数で切りぬく

Sponsored Links

CollationがLatinなど、Japaneseではない環境でバイト数指定で切り抜く。
Collationが日本語ではない環境では、ダブルバイトデータはnvarcharとしてテーブルに保存される。
LeftやSubstringでは、渡すArgumentは文字数指定となりバイト数での切り抜きができない。

バイト数を指定する方法として、nvarcharではなく、varcharを使用することで、バイト数指定でデータを切り抜くことができる。
ただし、日本語以外の環境で、ダブルバイトデータをvarcharに入れると「?」に文字化けするので、Collationを指定する必要がある。

下記の例では、「あいう123えお45かきく678けこ90」という文字列をバイト指定で切り出すときのサンプルを記載した。
nvarcharのデータをsubstringやleftを使用しても、その文字分が抽出されることとなる。

日本語のCollationを指定し、varcharへ変換することでバイト数指定の切り出しを行うことができる。
「select convert(VARCHAR(9), @string collate Japanese_bin);」では、最初の9バイト(あいう123)が出力される。
「select convert(VARCHAR(10), @string collate Japanese_bin);」では、最初の10バイトを取得する指定だが、10バイト目がダブルバイトの半分となるため、切れた分は捨て、前の例と同様、最初の9バイト分が切り出される。

最後の例では、最初の5バイトを抽出、その後、残りの中から12バイト分を抽出する例となる。
最初の5バイトは「う」が5バイト目に引っかかるため、「あい」が抽出される。
len(‘あい’)が2となり、その後、Substringの始めの位置は2+1で3文字目から始め、12バイト分の文字列を出力することとなる。
「substring(@string, len(convert(VARCHAR(5), @string collate Japanese_bin)) + 1, 12)」では、3文字目から12文字分取得(すべての文字がダブルバイトの時は24バイト分が抽出対象となる)するが、その後の「convert(VARCHAR(12)」で、12バイトで切り抜かれる。

declare @string as nvarchar(50) = N'あいう123えお45かきく678けこ90';
select @string collate Japanese_bin;
--あいう123えお45かきく678けこ90
select substring(@string,1,4);
--あいう1
select left(@string, 4);
--あいう1

select convert(VARCHAR(9), @string collate Japanese_bin);
--あいう123
select convert(VARCHAR(10), @string collate Japanese_bin);
--あいう123

select len(convert(VARCHAR(9), @string collate Japanese_bin));
--6
select len(convert(VARCHAR(10), @string collate Japanese_bin));
--6

select convert(VARCHAR(5), @string collate Japanese_bin);
--あい
select convert(VARCHAR(12), substring(@string, len(convert(VARCHAR(5), @string collate Japanese_bin)) + 1, 12) collate Japanese_bin );
--う123えお45

IT
Sponsored Links
Sponsored Links
Sponsored Links
ようさんチョットでぶ
Copied title and URL
Bitnami