職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

MySQL

「ユニコード戦記」を読んだ

仕事もプライベートもUnicode無しには考えられないという時代になって久しいですが、皆様いかがお過ごしでしょうか。 私は元気ですが、文字のことが頭から離れる日はありません。さて、3月に東京に遊びに行ったとき、渋谷のとある書店に立ち寄ったのですが、…

2月の米子の旅日記 〜 中国地方DB勉強会への参加など

先月の話ですが、鳥取県は米子に行ってきました。 中国地方DB勉強会 #19 を動機とした旅行計画でしたが、かなり満喫することができました。(続きを読む 際は写真が多くなることに注意)

create table

SQLで、select文の結果を、新規に作成するテーブルへ突っ込む方法があります。きちんと構築するアプリケーションの中で使うことは稀ですが、ささっとバックアップを取得したり、手軽にデータ分析をやったりとか、そういった用途で本当によく使います。 先日…

業務システム刷新

先日、会社の業務システムを刷新してきました。 書けること書けないこと色々ありますが、書けることだけかいつまんで、概要だけ紹介したいと思います。 もちろん、後年、自分自身で振り返ったときのためのメモでもあります。 形態と規模 一般的なLAMP(Linux…

MySQL で NOOP 操作

最近はMySQLのStoredProcedureを書きまくってる生活を送っています。さて、プログラムの可読性を保つ為に、次のようなテクニックを使うことがあります。 if( 何か条件式 ) { // 何もしないよ! ; } else { // 何か複雑な処理 this.someComplicatedMethod1();…

暗黙的デフォルト値

またまたMySQLでハマったのでメモ。 現象 実行できないはず(エラーになるはず)のSQL文が、MySQLでは実行できてしまいます。 具体的には、not null 制約のある列に対して null 値を格納させようとしても、実行できてしまう場合があります。 サンプルデータ…

PreparedStatementはSQLi対策として100%安全なのか?

脇の甘い技術者というのは世の中には多く存在していて、日本に居た時もAustraliaに来てからも、SQLi (SQL Injection) 脆弱性を見つけたり治したりすることは多々ありました。 基本的にはエスケープをかけるか Prepared Statement を使うかの2択で、可能な限…

壊れた統計情報

またもやMySQLで完全にハマったのでメモ。 症状 投げたクエリが、帰ってくる気配が無い。 process list を見ると、当該のクエリは "Copying to tmp table" と言っている。 当該クエリから ORDER BY 句を除いて実行すると、応答が無いのは同じだが、process l…

暗黙のGroup By

この記事はMySQLのdisってる記事…のように見えるかもしれませんが、「長年継ぎ足して熟成されてきた秘伝のソース」をdisる記事です。 原理?は MySQLのGroup By - 職業プログラマの休日出勤 や distinct と order by - 職業プログラマの休日出勤 と同じです…

distinct と order by

きっと GROUP BY のときの話 と同じ理屈なんでしょうけど、困ってしまったので記事に書いておきます。 テスト用テーブルの定義と、テストデータ(PostgreSQLでもMySQLでも動作OK) create table test20121028 ( id int primary key, data1 text not null ); …

update文中でのsubquery

数日前、またしてもMySQLの罠?に引っ掛かってしまったのでメモ。 どうやら、update文中のsubqueryでは、update対象テーブルをselectしてはいけないらしいです。 テスト用テーブル create table test20120831( id int primary key, category_name text, data…

MySQLのGroup By

MySQLの Group By でハマったのでメモ。 テスト用テーブルの定義(PostgreSQLでもMySQLでも動作OK) create table hogehoge ( id int primary key, classification varchar(10), value numeric(5) ); テスト用データ insert into hogehoge values (1, 'test'…