10
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MySQLで全角から半角(その逆も)に変換する方法

Last updated at Posted at 2019-11-22

クエリで出来てしまったほうが楽なことがあったので関数を作って試してみました。
数字や記号など含めてありますが、カタカナだけで良い場合は文字列の内容を変えるなりで対応できます。
その場合は、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」が「」になっていないと
    下記エラーが発生します。
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」の値を探してパラメータを「」にして保存してください。(再起動は不要です)

  • またさらにハマりポイントなのが、
    DBにあたっているパラメータグループがdefaultのものだったりする場合、パラメータの変更ができません。
    その場合は別途パラメータグループを作って値を変更したものをRDSのインスタンスに適用してください。
    (パラメータグループを変更する場合は一度RDSインスタンスを停止しないといけないかも・・・)

引用元

http://sonaiyuutemo.hatenablog.jp/entry/2017/10/06/155412
https://qiita.com/ytyng/items/1c5b9ee748f8d6d71c52

10
13
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
10
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?