2013年12月3日火曜日

SQL-Serverで、文字列をバイト数単位で分割する方法

東芝dynabook tab VT484によって、まさかの手のひらSQL-Server 2012が実現して、もう感涙であります。

これからは、読書をする感覚で、気軽にSQLの読み書きが出来る。

なんという時代になったんだ!!!

さて、そんな気軽な感覚で、ちょっとSQL-Serverにおける文字列のバイト数での分割や切り出しについて考えてみたいと思います。



SQL-Serverですが、文字列を扱う場合は基本的にバイト数ではなくて文字数になり、バイト数では指示出来ません。

ですから、たとえば、「あいうえお」という文字列の先頭3バイト切り取れ、という場合は・・・



SELECT
SUBSTRING(CAST('あいうえお' AS TEXT),1,3)
という感じに、一旦TEXT型に変換してから切り出すと行けます。

しかし、全角文字の断ち割り問題は、自分で処理しないといけません。

どういう事かというと、SQL-Serverは、最後の一文字が断ち割れてしまった時は面倒を見てくれるのですが、先頭の一文字がいきなり断ち割れた場合は、文字化けして面倒を見てくれないのです。

たとえば、文字列を20バイトづつに分割したい、という場合、素直に分割してしまうと・・・


上記のように、前半の20バイトは良いのですが、後半の20バイトがメタメタに文字化けしているのが分かると思います。


じゃあどうするか、というと、SQL-Serverが全角文字を最後の一文字で断ち割った時は、指定バイト数よりも1バイト欠損するという性質を利用して、判定に使います。



CASE WHEN DATALENGTH(SUBSTRING(CAST([名前] AS TEXT),1,20)) < 20
THEN SUBSTRING(CAST([名前] AS TEXT),20,21)
ELSE SUBSTRING(CAST([名前] AS TEXT),21,20)
END AS [名前2] 
欠損していたら、後半は1バイト前のデータから取得するようにします。
その分、長さは伸ばすようにしています。

文字数単位の世界になってから長いですが、日本だと文字数じゃなくてバイト数単位での処理がメインなような気がする・・・



東芝dynabook tab VT484、その何でも出来るモバイルというだけでなく、ハードウェアの造りも大したもんです。

何と、絶対にやっちゃいけないんですが、寝落ちしてしまって一晩枕の下敷きにして寝てました。

ぎゃぁーー。
気が付いたら全身の毛が逆立ったのですが、全く問題なしで、このブログもdynabook tab VT484で普通に書かせて頂いております。
液晶は発色も癖が無くて美しいし、ボディはなんか妙に頑丈だし、5万9800円って、そりゃこんくらいするよなぁという「納得感」が買ってから日増しにブーストかかってます。