AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

SQL 用にマルチバイト文字を "" (ダブルクォーテーション) で囲む

いっつも vi の VISUAL BLOCK ででツラ揃えてか EXCEL 使ってパワーで編集してたんだけど「いい加減調べるか」と腹をくくったなど。

[\x00-\x7F]で、すべてのASCII文字にマッチします。これの否定の[^\x00-\x7F]とすることでASCII文字以外、つまり全角文字にマッチさせることができます。

so-zou.jp

なるほどー!

以下のようなデータが存在するとする。

INSERT INTO (generation, name, name_read, created_at, updated_at`) VALUES (3, 兎田ぺこら, うさだぺこら, 2019-07-17, NOW());
INSERT INTO (generation, name, name_read, created_at, updated_at`) VALUES (3, 潤羽るしあ, うるはるしあ, 2019-07-18, NOW());
INSERT INTO (generation, name, name_read, created_at, updated_at`) VALUES (3, 不知火フレア, しらぬいふれあ, 2019-08-07, NOW());
INSERT INTO (generation, name, name_read, created_at, updated_at`) VALUES (3, 白銀ノエル, しろがねのえる, 2019-08-08, NOW());
INSERT INTO (generation, name, name_read, created_at, updated_at`) VALUES (3, 宝鐘マリン, ほうしょうまりん, 2019-08-11, NOW());

name name_read はマルチバイト文字列なので "" で囲わないと syntax error が返ってくる (はず)。ので、これをくくるにはどうするか、という話し。

上記のパターンだと冒頭の正規表現を利用して ([^\x00-\x7F]), ([^\x00-\x7F]) と検索すれば、以下のようになる。

f:id:donbulinux:20220203073023p:plain
マルチバイト文字に挟まれたカンマと前後 1 文字に一致した

で、 [^\x00-\x7F]() で囲っているので $ を用いて保持しておくことができる。

つまり、 $1","$2 で置換するとこうなる。

f:id:donbulinux:20220203073416p:plain
ツラの揃わない所に挿入できた

これでめんどくさい「マルチバイトに挟まるカンマ」が処せたので、あとは 3,3, " に、 , 2019-", 2019- にすれば、無事ダブルクォートで囲うことができた。

f:id:donbulinux:20220203074524p:plain
VScode の文字装飾が便利でエディタ乗り換えたまである

なお、上記のデータ形式なので、このような特定の値 (3 とか 2019- など) を指定した置換を実施して後処理をしているけども、それぞれ以下のように置換したほうが安全だと思う。というか最初からそうやれ。

  • , ([^\x00-\x7F]), "$1
  • ([^\x00-\x7F]),$1",

もっとスマートに処理できる気がするけど、この時間にこの記事書いてる時点で察してください。