Oracleのデータ内に半角と全角文字列が混じっているものを抽出する

全角文字列に半角文字列が入っている

システム変更に伴って以前のデータに対する考え方に変更が生じると色々な問題がでてくる

・時間付のDATE型 が 日付のみのDATE型
・文字列の持ち方


今回発生したのが、文字列のデータ方法において半角と全角文字が混在しているというもの
システムリプレースを実施した際に、半角文字が格納されないように全角文字列に自動的に修正した上でINSERTするように制御を変更をしたものの、旧システムにおいては制御がかかっていなかったので複雑な入り方で混在している

例:
社名で (株) と (株)
番地で 1-2-3 と 1-2-3
途中の番地が 1-2-3
スペースが 田中 太郎 と 田中 太郎

現行システムは文字列を全角に表示するという制御が働いているので、半角が含まれる情報を呼び出しても全角に変換されて表示するので見分けがつかない

どうやって探すんじゃい!
ということになる


今、予定している新しい印字システムがバイト計算で印字を実施するので半角が混じっていると予想していない改行が生じる可能性がでてきた。
印字システム側で半角が入っていたら全角に変換して印字するという仕組みを組み込んでもいいが、負の遺産となってしまったデータに対しての制御は余計な処理を今後も続けることになってしまう

それならば元データを一気に処理してしまいたい
ということである

影響の出そうなカラムは全体で10個程度なのでSQLで個別に抽出していくことにした

比較は単純に、
 バイト数と文字列数を比較して差が生じれば半角文字が存在している
とした

Lengthb でバイト数を算出
Length で文字数を算出して2倍することで全角になった場合のバイト数にする
この2つを比較して同数ならば半角が混在するか半角のみのデータが抽出される

抽出された対象を変更したい場合に手で修正していくと面倒なのと、前述したとおり現システムは全角表示されているので半角を全角に修正入力しても、システム側は変化がないとみなして更新してくれない…

そこでデータベースを直接書き換えていくようにした