無気力生活 (ノ ´ω`)ノ ~゜

脱力系エンジニア。てきとーに生きてます。

varcharのuser_idと戦うぼくらには

結論だけ申し上げると、数値以外の変な入力にマッチさせるには、正規表現POSIXクラス[[:cntrl:]]使えば良いです。

古いシステムでこの運用多くありません?

varcharでnull可な、user_id(´・ω・`)
文字列想定しているけど使われていない残念なケースです。多分。

今、私の仕事は古いサービスをモダンにリプレースするという仕事をやっているわけですが、でるわでるわDB的なアンチパターン。カラムが大量(40とか)にあるテーブルに、溢れ出す9本のインデックス。うん、これは大層つらい。

今回話すのは、地味に困ったuser_idの話です。旧システムの開発データにこんなのいました。

”12345\n6”

間に改行コード入ってるやーつ(´・ω・`)本番ではないデータな気はするのですが、伝承されている仕様が失伝しているため、確証持てず。

Ruby使って文字列から数値に変換するには、to_iというメソッドを使えばよいのですが、上の入力をto_iすると

”12345\n6”.to_i
=> 12345

改行した先にいる6が消える( ゚д゚)こまる。 単純に\nをgsubで置換しちまおうと思っていたのですが、他の制御文字のことを考えると微妙い対応になるんですよねぇ(´・ω・`)

で調べた結果、:cntrl:正規表現でマッチさせればいいことを知ります。

正規表現 - Wikipedia

とりあえずこれで解決。