pagetakaBlog

最近リフォームと鳥取県日南町の記事多め。写真、PC、ネット等の話題も

MySQL備忘録:NULL、''、' 'など、どの空白にも該当しない不思議

【MySQL上の表示で空白がある売買状況の一部】
【MySQL上の表示で空白がある売買状況の一部】

株価データをMySQLに放り込んでます。

東証株式相場表日報(PDF)DLし、PDFMinerで文字数字を取り出しCSV化後、MySQLに保管しています。

銘柄によっては取引が成立せず、前場寄値~後場引値、売買高などでいわゆる「空値」のことがあります。必要に迫られ「空値」を抽出することになりました…大苦戦しました。

NULL、''、' 'など 空白にヒットしない不思議。

爺はネット徘徊しました。一般に示されている「空値」を得る手法に引っかからないのです。

SELECT 、WHERE、IS、= などをくみあわせ、NULL、'' 、’ '(半角空白)などでチェックしてみましたがいずれも望む結果を得られませんでした。

目に見えないだけで、なにかがあるのではないか…と妄想しました。

ASCIIコードのことを思い出しました。改行など結果的に見えるように表示されるけどいわゆる「文字」ではありません。そのほか、ASCIIコード先頭には「制御コード」がいくつか並んでます。1980年代、N88-BASICのころらPC使ってて、ずいぶんお世話になりました。

MySQLでASCIIコード表示できるか…。

NULLなどを検索ヒットする方法から、MySQLでASCIIコード表示させることができるか、調べる方向を変えました。

説明によると「ASCII(str)」でコード番号を表示できるみたいです。例示された使い方は、SELECT内でのものでした…。だめかな~と思いつつWHERE内で使ってみました。

SELECT * FROM `a_table` WHERE ASCII(a_column)=0;

「WHERE ASCII(a_column)=0」のところがポイントです。

ASCIIコード0は見えないけど、NUL、\0、ナル文字を表す…らしい。

コード番号0から始めてみようということで、最初にヒットしたという幸運でした。MySQLの逐次番号で検索対象の位置がわかっているなら、WHERE:逐次番号、SELECT:a_columnでASCII(a_column)でコード番号を確認した方が何が「空値」に使われているか(見えるかどうかは別にして)を知ることができますね。

SELECT ASCII(a_column) FROM `a_table` WHERE number=NNNN;

みえないから「文字はない、空」と思い、NULL、’’でヒットさせようとしてもそうならない不思議。実は「(制御)文字はある、目に見えない」ということでした。

Pythonで利用するとき欠損値の扱いに困ってましたが、解決のメドが立ちました。

Pandas、Numpyなどデータ処理をする際、欠損値があるデータの扱いが面倒です。そもそも、効率よく欠損値のある個所(行、列、その他)を見つけることができないと、先に進めません。今回困っていたのはPython内でのSQL文で、ヒットしないという問題にぶち当たっていました。phpMyAdminでもしばらく苦戦しました。結局、phpMyAdmin上でのSQL文でASCII関数を使うことで見つけることがわかりましたのでヤレヤレです。

とはいえ、まだPythonでのSQL文で試してないので…はやとちりにならなければよいのですが、忘れては一大事ということで「備忘録」にしました。