おがわみつぎの SQL Server な BLOG

雑多な日々

PASSJブログ ホーム 連絡をする RSS ATOM Login
  276 投稿数 :: 0 ストーリー :: 329 コメント :: 67 トラックバック

ニュース


Microsoft Most Valuable Professional

MVP プロファイル














過去の記事

カテゴリ

イメージギャラリ

BLOGS

MVP

技術系

白血病

  • [SQL Server 2005]JIS X 0213:2004 対応文字列操作 SQL CLR ユーザー定義関数

ひっそりと公開。(コードなし)
http://www.horae.dti.ne.jp/~ogawa/samples/JapaneseStringManipulate.exe
登録は JapaneseStringManipulate.sql を参考に。
ソースコードは将来公開する予定ですが、現在のところ公開しません。
バグや質問があれば、直接ブログの「連絡する」から連絡してください。
なお「3 つ以上で 1 文字表示する結合文字には対応していません」のでご注意ください。

背景
UNICODE の補助文字(サロゲートペア、16bit + 16bit の 32bit で表す)・結合文字(UNICODE 基本多言語面〈16bit〉の中で、見た目上 1 文字になっているが、実は別々の文字が合成して表示される文字のこと、濁音符記号などが該当する)を SQL Server 2005 の標準文字列関数(LEFT、LEN、REVERSE、RIGHT、STUFF、SUBSTRINGの各関数)で正しく処理できないため、SQL CLR を使った実装が必要になる

処理実装

  • 基礎実装
    1. 補助文字・結合文字(半角カタカナ濁音記号も含む)・基底文字を文字単位で判定メソッド
    2. 補助文字・基底文字 + 結合文字(半角カタカナ濁音記号も含む)・基底文字・結合文字単体で分解し、ArrayList 化するメソッド
  •  JapaneseLeft 関数
    JapaneseSubstring 関数に開始位置 1 、JapanseLeft 関数の value 引数、length 引数を渡して、結果を返す
  •  JapaneseLen 関数
    StringInfo.ParseCombiningCharacters で、文字数を取得
    半角カタカナ濁音記号も 1 文字とカウントされる
  •  JapaneseLen2 関数
    value 引数を ArrayList 化し、ArrayList.Count の結果を返す
    半角カタカナ濁音記号は基底文字が先にあった場合、ArrayList 化するときに基底文字 + 半角カタカナ濁音記号で格納するため、カウントしない
    基底文字が先にない場合は半角カタカナ濁音記号も 1 文字としてカウントする
  •  JapaneseReverse 関数
    value 引数を ArrayList 化し、ArrayList.Reverse メソッドで反転し、結果を返す
  •  JapaneseRight 関数
    value 引数を JapaneseReverse 関数で反転し、値を JapaneseLeft 関数の value 引数とし、JapaneseRight 関数の length 引数を渡して左から切り出し、結果を再度反転させて結果を返す
    ※これがアホな実装の 1 つ
  •  JapaneseStuff 関数
    value 引数を ArrayList 化し、開始位置(start)までは ArrayList 化した文字を格納し、開始位置から削除範囲(length)までは、挿入文字で入れ替え、範囲を超えたらまた ArrayList 化した文字を格納して、結果を返す
  •  JapaneseSubstring 関数
    value 引数を ArrayList 化し、ArrayList を開始位置(start)から文字幅(length)を切り出して結果を返す
投稿日時 : 2007年6月12日 23:55

Feedback

# re: [SQL Server 2005]JIS X 0213:2004 対応文字列操作 SQL CLR ユーザー定義関数 2007/06/13 11:37 河端善博
公開ありがとうございます。

濁音... nchar(12441), nchar(12443)

if nchar(170) = N'A' + nchar(12441) collate japanese_90_ci_as
print 'OK ?';

ふむふむ。


# re: [SQL Server 2005]JIS X 0213:2004 対応文字列操作 SQL CLR ユーザー定義関数 2007/06/14 18:14 おがわみつぎ
補助文字・結合文字が問題というより、重みの無い文字のほうが問題ですね。

-- BMP 文字 65535 文字の重み設定確認スクリプト
SET NOCOUNT ON
DECLARE @s NCHAR(1) -- 比較元ソース文字
DECLARE @n INT -- カウンタ
DECLARE @c NCHAR(1) -- 生成文字格納用
DECLARE @t TABLE([文字] NCHAR(1), [UNICODE値] INT, [UNICODE16進数値] BINARY(2), [照合順序] NVARCHAR(20)) -- 結果格納用テーブル値変数

-- 比較用の重みの無い文字で比較、もしくは半角スペースでも可
SET @s = NCHAR(0x2616)

-- ループカウンタ初期化
SET @n = 1

-- 65,535 ループ
WHILE @n <= 65535
BEGIN
-- UNICODE 文字生成
SET @c = NCHAR(@n)

-- ?と比較
IF @s = @c COLLATE Japanese_90_CI_AS
-- 結果格納用テーブル値変数に代入
INSERT @t VALUES(@c, @n, CONVERT(BINARY(2), UNICODE(@c)), N'Japanese_90_CI_AS')
-- カウントアップ
SET @n = @n + 1
END
SELECT * FROM @t ORDER BY [UNICODE値], [照合順序]
SELECT [照合順序], COUNT(*) AS [件数] FROM @t GROUP BY [照合順序]

# 11/24(土)開催 「SQL Server - JIS X 0213:2004 /高度なインデックス」土曜 1 日集中コース 2007/11/07 18:04 PASSJアフタースクール
11/24(土)開催 「SQL Server - JIS X 0213:2004 /高度なインデックス」土曜 1 日集中コース

コメント

タイトル:
名前:
Url:
コメント: