LoginSignup
0
0

More than 3 years have passed since last update.

SQL ServerのストアドファンクションでUnicodeエスケープする話

Posted at

はじめに

最近、SQL ServerでWebアプリを開発しているのですが、DB側の処理でユニコードエスケープする必要が出てきました。
しかし、SQL Serverにはユニコードエスケープする関数が用意されておらず自作することになりました。

前提

SQL ServerはUnicode文字列を保存できるデータ型や照合順序が決まっています。
もしUnicode文字列が「???」となってしまう場合は、データ型や照合順序を確認してみてください。

実装

Unicodeエスケープの仕組み(処理の内容)に関しては、参考となるページがたくさんあるので調べてみてください。
ここでは省略させてください。

今回使ったSQL Serverの関数は以下の通り

実際の処理は下記です。

DECLARE @target nvarchar(100) = N'対象文字1字'
DECLARE @binary int;
SET @binary = UNICODE(@target COLLATE Japanese_Bushu_Kakusu_100_CI_AS_SC);

SELECT
    CASE
        WHEN @binary >= 0x0020 AND @binary <= 0x0020 THEN @target
        WHEN @binary >= 0x0023 AND @binary <= 0x005B THEN @target
        WHEN @binary >= 0x005D AND @binary <= 0x007A THEN @target
        WHEN @binary > 0xFFFF THEN CONCAT('\u',LOWER(CONVERT(VARCHAR(8), CAST((@binary - 0x10000) / 0x0400 + 0xd800 AS VARBINARY(2)), 2)),
            CONCAT('\u',LOWER(CONVERT(VARCHAR(8), CAST((@binary - 0x10000) % 0x0400 + 0xdc00 AS VARBINARY(2)), 2))))
        ELSE CONCAT('\u', LOWER(CONVERT(VARCHAR(8), CAST(@binary AS VARBINARY(2)), 2)))
    END

ユニコードエスケープの処理自体が、言語によってまちまちなので、CASE文の分岐に関しては、もう少しパターンがあるかもしれません。
また、今回はアルファベットや半角数字などエスケープする必要がないものはエスケープ対象外としています。

さいごに

今回、ユニコードエスケープをSQL Serverの処理だけで実現するために、結構苦労しました。
検索してみても、あまり同じようなことをしようとしている人がいないので、そもそもこういう設計になっているのがおかしいのかもしれません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0