- blogs:
- cles::blog
2011/11/10

MySQL のストアドで urlencode/urldecode する

データベースにurlエンコードされたままの文字列が入ってしまって困っていたのですが、ストアドを使えば比較的容易にデコードすることが出来そうだったので試してみました。MySQL は10年くらい前はストアドが使えないデータベースだったのですが、いまやちゃんと使えるんですね。ちなみにこの手のストアドはググると沢山みつかるのですが、今回は UTF-8 のエンコード、デコードができるものについてメモしておきます。
ストアドの定義が完了すると、こんな感じでエンコードデコードができるようになります。
mysql> select 'テスト', urlencode('テスト'), urldecode(urlencode('テスト')), urldecode('%e3%83%86%e3%82%b9%e3%83%88');
+-----------+-----------------------------+-----------------------------------+------------------------------------------+
| テスト | urlencode('テスト') | urldecode(urlencode('テスト')) | urldecode('%e3%83%86%e3%82%b9%e3%83%88') |
+-----------+-----------------------------+-----------------------------------+------------------------------------------+
| テスト | %E3%83%86%E3%82%B9%E3%83%88 | テスト | テスト |
+-----------+-----------------------------+-----------------------------------+------------------------------------------+
1 row in set (0.00 sec)
もちろんperlやphpでプログラムを書く手もあるのですが、ちょっとした処理をするときにはこれは便利ですね。
具体的なストアドは下記にメモしておきます。
† urldecode()
urlencode/urldecode as MySQL stored functions [sql] [mysql] [urlencode] [urldecode]
DROP FUNCTION IF EXISTS urldecode;
DELIMITER |
CREATE FUNCTION urldecode (s VARCHAR(4096)) RETURNS VARCHAR(4096)
DETERMINISTIC
CONTAINS SQL
BEGIN
DECLARE c VARCHAR(4096) DEFAULT '';
DECLARE pointer INT DEFAULT 1;
DECLARE s2 VARCHAR(4096) DEFAULT '';
DECLARE h3 VARCHAR(4096) DEFAULT '';
IF ISNULL(s) THEN
RETURN NULL;
ELSE
SET s2 = '';
WHILE pointer <= LENGTH(s) DO
SET c = SUBSTR(s,pointer,1);
IF c = '+' THEN
SET h3 = '20';
ELSEIF c = '%' AND pointer + 2 <= LENGTH(s) THEN
SET h3 = UPPER(SUBSTR(s,pointer+1,2));
SET pointer = pointer + 2;
ELSE
SET h3 = HEX(c);
END IF;
SET s2 = CONCAT(s2,h3);
SET pointer = pointer + 1;
END while;
END IF;
RETURN UNHEX(s2);
END;
|
DELIMITER ;
† urlencode()
Tools :: Code Snippet :: Url Encode for utf8*1
DELIMITER $$
DROP FUNCTION IF EXISTS `urlencode` $$
CREATE FUNCTION `urlencode`(original_text text) RETURNS text CHARSET utf8
BEGIN
declare new_text text DEFAULT NULL;
declare current_char varchar(10) DEFAULT '';
declare ascii_current_char int DEFAULT 0;
declare pointer int DEFAULT 1;
declare hex_pointer int DEFAULT 1;
IF original_text IS NOT NULL then
SET new_text = '';
while pointer <= char_length(original_text) do
SET current_char = mid(original_text,pointer,1);
SET ascii_current_char = ascii(current_char);
IF current_char = ' ' then
SET current_char = '+';
ELSEIF NOT (ascii_current_char BETWEEN 48 AND 57 || ascii_current_char BETWEEN 65 AND 90 || ascii_current_char BETWEEN 97 AND 122
|| ascii_current_char = 45 || ascii_current_char = 95 || ascii_current_char = 46 || ascii_current_char = 126
|| ascii_current_char = 34
) then
SET current_char = hex(current_char);
SET hex_pointer = char_length(current_char)-1;
while hex_pointer > 0 do
SET current_char = INSERT(current_char, hex_pointer, 0, "%");
SET hex_pointer = hex_pointer - 2;
end while;
end IF;
SET new_text = concat(new_text,current_char);
SET pointer = pointer + 1;
end while;
end IF;
RETURN new_text;
END $$
DELIMITER ;
- *1: 関数名をあわせるためにちょっと改変済み
トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/4564
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 . アーロンチェアのポスチャーフィットを修理(114428)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(112949)
3 . 年次の人間ドックへ(112375)
4 . 2023 年分の確定申告完了!(1つめ)(111944)
5 . 三菱鉛筆がラミーを買収(111818)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(112949)
3 . 年次の人間ドックへ(112375)
4 . 2023 年分の確定申告完了!(1つめ)(111944)
5 . 三菱鉛筆がラミーを買収(111818)
cles::blogについて
Referrers