やりたいこと
MySQLで、データをマスキングしたい。(氏名など)
経緯
調べたところ、文字列の置換ができるINSERT関数が出てきたので、その使い方を残します。
環境
Windows10(XAMPP5.6.38)、MySQL5.7
INSERT関数の説明
パラメータは次のようになっています。
INSERT(元の文字列, 対象位置※, 置換する文字数, 置換する文字列)
※対象位置・・・1文字目は1で指定します(0ではない)
戻り値は、以下の文字列です。
「元の文字列」の「対象位置」の文字数目から「置換する文字数」分を、「置換する文字列」で置換(または挿入)したもの
置換する文字数に0を指定すると、対象位置の前に、置換する文字列を”挿入”します。
今回は、どういう動きになるのか確認する為、SELECT文を実行していますが、
INSERT文のSET句でも使えます。
確認結果
以下、"=>"の後ろの文字列が、出力結果です。
(1)3文字目から1文字分を、'〇'で置換する
SELECT INSERT('あいうえお', 3, 1, '〇');
-- => あい〇えお
(2)3文字目から2文字分を、'〇'(1文字)で置換する
SELECT INSERT('あいうえお', 3, 2, '〇');
-- => あい〇お
(3)3文字目から1文字分を、'〇〇'(2文字)で置換する
SELECT INSERT('あいうえお', 3, 1, '〇〇');
-- => あい〇〇えお
(4)3文字目から2文字分を、'〇〇'(2文字)で置換する
SELECT INSERT('あいうえお', 3, 2, '〇〇');
-- => あい〇〇お
(5)3文字目から0文字分を、'〇〇'(2文字)で置換する(=3文字目の前に挿入される)
SELECT INSERT('あいうえお', 3, 0, '〇〇');
-- => あい〇〇うえお
(6)0文字目から0文字分と指定すると、変わらない
SELECT INSERT('あいうえお', 0, 0, '〇');
-- => あいうえお
(7)1文字目から0文字分と指定すると、先頭に挿入する
SELECT INSERT('あいうえお', 1, 0, '〇');
-- => 〇あいうえお
(8)開始位置の指定が、元の文字数より大きい場合、変わらない
SELECT INSERT('あいうえお', 7, 1, '〇');
-- => あいうえお
(9)「開始位置+置換する文字数」が元の文字数より大きくなる場合、置換できるところまで置換する
SELECT INSERT('あいうえお', 4, 5, '〇');
-- => あいう〇