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

クエリで出来てしまったほうが楽なことがあったので関数を作って試してみました。
数字や記号など含めてありますが、カタカナだけで良い場合は文字列の内容を変えるなりで対応できます。
その場合は、varcharの桁数もあわせればOK。

## 全角から半角にする方法
UTF-8の文字コードで作ってます。このへんはutf8mb4にするなり変更が可能ですね。

```SQL
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 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンッャュョァィゥェォ　ー。「」、・１２３４５６７８９０';
    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 ;
```


## 半角から全角にする方法

↑の逆になります。

```SQL
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 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンッャュョァィゥェォ　ー。「」、・１２３４５６７８９０';
    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 ;
```

## 使い方

```SQL
select han2zen('ｱｲｳｴｵｶﾞｷﾞｸﾞｹﾞｺﾞザジズゼゾ123４５６')
アイウエオガギグゲゴザジズゼゾ１２３４５６

select zen2han('ｱｲｳｴｵｶﾞｷﾞｸﾞｹﾞｺﾞザジズゼゾ123４５６')
ｱｲｳｴｵｶﾞｷﾞｸﾞｹﾞｺﾞｻﾞｼﾞｽﾞｾﾞｿﾞ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