Note to Self

自分用のメモ置き場

MySQLで半角カタカナを全角に変換する

MySQLで半角カタカナを全角に変換する

便利な関数は無いため、ストアドファンクションを作成し対応

DROP FUNCTION IF EXISTS kanaToKANA;

DELIMITER //

CREATE FUNCTION kanaToKANA (data TEXT) RETURNS TEXT DETERMINISTIC
BEGIN
  DECLARE kana1_len, kana2_len INT;
  DECLARE kana1_h VARCHAR(62) DEFAULT 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンッャュョァィゥェォ ー。「」、・';
  DECLARE kana1_z VARCHAR(62) DEFAULT 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンッャュョァィゥェォ ー。「」、・';
  DECLARE kana2_h VARCHAR(52) DEFAULT 'ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴ';
  DECLARE kana2_z VARCHAR(26) 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 hogeKanaName, kanaToKANA(hogeKanaName) FROM t_hoge;

-- 対象レコードを更新
UPDATE t_hoge SET hogeKanaName = kanaToKANA(hogeKanaName);