クエリで出来てしまったほうが楽なことがあったので関数を作って試してみました。
数字や記号など含めてありますが、カタカナだけで良い場合は文字列の内容を変えるなりで対応できます。
その場合は、varcharの桁数もあわせればOK。
全角から半角にする方法
UTF-8の文字コードで作ってます。このへんはutf8mb4にするなり変更が可能ですね。
DROP FUNCTION IF EXISTS zen2han;
DELIMITER //
CREATE FUNCTION zen2han (data TEXT character set utf8) RETURNS TEXT character set utf8 DETERMINISTIC
BEGIN
DECLARE kana1_len, kana2_len INT;
DECLARE kana1_h VARCHAR(72) character set utf8 DEFAULT 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンッャュョァィゥェォ ー。「」、・1234567890';
DECLARE kana1_z VARCHAR(72) character set utf8 DEFAULT 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンッャュョァィゥェォ ー。「」、・1234567890';
DECLARE kana2_h VARCHAR(52) character set utf8 DEFAULT 'ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴ';
DECLARE kana2_z VARCHAR(26) character set utf8 DEFAULT 'ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴ';
SET kana1_len = CHAR_LENGTH(kana1_h);
SET kana2_len = CHAR_LENGTH(kana2_h);
WHILE kana2_len > 0 DO
SET data = REPLACE(data, SUBSTRING(kana2_z, kana2_len, 1), SUBSTRING(kana2_h, kana2_len * 2 - 1, 2));
SET kana2_len = kana2_len - 1;
END WHILE;
WHILE kana1_len > 0 DO
SET data = REPLACE(data, SUBSTRING(kana1_z, kana1_len, 1), SUBSTRING(kana1_h, kana1_len, 1));
SET kana1_len = kana1_len - 1;
END WHILE;
RETURN data;
END;
//
DELIMITER ;
半角から全角にする方法
↑の逆になります。
DROP FUNCTION IF EXISTS han2zen;
DELIMITER //
CREATE FUNCTION han2zen (data TEXT character set utf8) RETURNS TEXT character set utf8 DETERMINISTIC
BEGIN
DECLARE kana1_len, kana2_len INT;
DECLARE kana1_h VARCHAR(72) character set utf8 DEFAULT 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンッャュョァィゥェォ ー。「」、・1234567890';
DECLARE kana1_z VARCHAR(72) character set utf8 DEFAULT 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンッャュョァィゥェォ ー。「」、・1234567890';
DECLARE kana2_h VARCHAR(52) character set utf8 DEFAULT 'ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴ';
DECLARE kana2_z VARCHAR(26) character set utf8 DEFAULT 'ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴ';
SET kana1_len = CHAR_LENGTH(kana1_z);
SET kana2_len = CHAR_LENGTH(kana2_z);
WHILE kana2_len > 0 DO
SET data = REPLACE(data, SUBSTRING(kana2_h, kana2_len * 2 - 1, 2), SUBSTRING(kana2_z, kana2_len, 1));
SET kana2_len = kana2_len - 1;
END WHILE;
WHILE kana1_len > 0 DO
SET data = REPLACE(data, SUBSTRING(kana1_h, kana1_len, 1), SUBSTRING(kana1_z, kana1_len, 1));
SET kana1_len = kana1_len - 1;
END WHILE;
RETURN data;
END;
//
DELIMITER ;
使い方
select han2zen('アイウエオガギグゲゴザジズゼゾ123456')
アイウエオガギグゲゴザジズゼゾ123456
select zen2han('アイウエオガギグゲゴザジズゼゾ123456')
アイウエオガギグゲゴザジズゼゾ123456
注意点
- 今回関数を作って対応しましたが、ハマりポイントがありましたので追記しておきます。
私が試した環境はAWS RDSのMySQLだったのですが、
DBのパラメータグループにある「log_bin_trust_function_creators
」が「1
」になっていないと
下記エラーが発生します。
You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
これはrootユーザーであってもできません。
RDSのダッシュボードのパラメータグループから「log_bin_trust_function_creators
」の値を探してパラメータを「1
」にして保存してください。(再起動は不要です)
- またさらにハマりポイントなのが、
DBにあたっているパラメータグループがdefault
のものだったりする場合、パラメータの変更ができません。
その場合は別途パラメータグループを作って値を変更したものをRDSのインスタンスに適用してください。
(パラメータグループを変更する場合は一度RDSインスタンスを停止しないといけないかも・・・)
引用元
http://sonaiyuutemo.hatenablog.jp/entry/2017/10/06/155412
https://qiita.com/ytyng/items/1c5b9ee748f8d6d71c52