【番外編】ライトノベルで学ぶMySQL入門(小説家になろう版)~CHINPOが長すぎる~
今年は梅雨になるのが早いらしい。ここのところずっと雨が降り続いている。
かったるい授業のあと、俺はいつものように部室に顔を出した。
するとノートPCを広げて、愛華が困り顔をしていた。
「どうした、愛華?」
「それが、CHINPOが長すぎるんですよ!」
「は?」
CHINPOが長すぎる。いったいどういう状況なのだろう?
愛華がネットで漫画を読んでいて、その男性キャラのCHINPOが長すぎて迷惑なのだろうか?
話を聞いてみると、MySQLの話だった。エロい漫画ではなさそうである。
「これを見て下さい!」愛華はディスプレイをこちらへ向けた。
ノートPCには、コマンドプロンプトが表示されている。
select id,note,length(note) from menu;
id|note|length(note)
1|CHINPO|7
「MySQLでSELECTした結果か。それがどうした?」
「よく見て下さい。CHINPOの長さが『7』になってます!」
「あ、文字列の長さな。紛らわしい。CHINPO文字列は6になるはずだな。うーん……」
何かの画面から入力した値をMySQLに格納するのだが、その値を見ていて愛華がそれに気づいたらしい。
MySQLのLENGTH()は文字列の長さをバイト単位で返す関数だ。正しく動いていない気がする。
「どうしたの?CHINPO、CHINPOって叫んで。廊下まで聞こえてるわよ!」
真琴が入ってきた。こいつなら何かわかるかもしれない。
俺はこれまでの経緯を誠に説明した。
「そうね。HEX()を使えば何かわかるかも」
「HEX()って何ですか?」愛華が聞く。
「引数の文字列の16進数文字列表現を返すわ。とりあえずちょっとPCいじらせて」
そして真琴がカタカタとPCのキーボードを叩く。
結果は次のようになった。
select id,note,length(note),hex(note) from menu;
id|note|length(note)|hex(note)
1|CHINPO|7|4348494E504F00
「4348494E504F00ってのが16進数表現なのか?」俺は聞く。
「そうよ。16進数で43はC、48はH、49はI、4EはN、50はP、4FはO」
「最後の00は何なんですか?」
「これはnull文字よ」
「何かの拍子にnullが混入したってことか」
「そう。だから文字数が合計で7になってしまったわけ。CHINPOヌルヌルになってしまったわけだわ」
「CHINPOヌルヌルがオチかよ……」
今回はMySQLのカラムに不正な文字が混入し、文字列の長さが合わないという現象について書いてみました。
そもそも不正な文字が入らないようにする工夫が大事ではあったりしますね。
業務でこんな「不正なデータが混入したかも?」という現象に遭遇したら、今回のようなテクニックが役立つかもしれません。