いう理由でこういうことになってるんだろう。以下のようなテーブルを作る。TIMESTAMP)ENGINE=InnoDBそして以下のINSERT文を実行する。(1)そうすると作成されたレコードのdt1,dt2はともにNULLだろうと、MySQL初心者の自分は思った。実際、そのレコードは以下のようになっている。入れた覚えのない値がdt1、dt2に入っている。してみると、結果は以下のようになる。NULL制約が付いていて、さらにdt1はCURRENT_TIMESTAMP、dt2には意味不明なデフォルト値が設定される。これは親切のつもりなんだろうか?BIGなお世話だ。それとも正当な理由があるんだろうか?そもそもdt2のデフォルト値の"0000-00-00"ってなんだ?西暦は1年から、元号も元年(1年)からで、「0年0月0日」なんて聞いたことがない。MySQLではTIMESTAMP型の列ではNULLを許す場合、次のように明示的にNULL制約(?)を書いてやらないといけないようだ。NULL制約とデフォルト値が付けられる。結果は以下のようになる。実行したら、エラーになった。TABLEは実行できないようになっているらしい。間違ってデータを全削除したり全更新するのを防ぐためだろうか。TABLEできるようにするには、システム変数sql_safe_updatesを以下のようにして0にセットすればよい。updateモードかどうかは以下のどちらかで調べられる。SELECTの方は0か1、SHOWの方はONかOFFと表示される。2015MySQLメモ017:CREATE文、AUTO_INCREMENT、ENGINE関連記事:MySQLメモ004:テーブルの作成:MySQLメモ013:INSERT後にAUTO_INCREMENTなカラムの値を取得する方法MySQLについては前に少し勉強したが、ほとんど忘れてしまった。既存のシステムでMySQLを使っているものは触ったことはあるが、新規の開発でMySQLというのは初めてなので、色々メモ。テーブルの主キーのカラムには、PostgreSQLの場合はシーケンスを用意してそこから値を取っていた。MySQLにはシーケンスがない。MySQLではカラムにAUTO_INCREMENT制約を付けてシーケンスの代わりにする。これでINSERT時に値を指定しなくても自動的に値がセットされる。初期値は1でINSERTするたびに自動的にインクリメントされる。TABLE文の例は以下。KEY(id))ENGINE=InnoDB;このテーブルにINSERT2回行って、SELECTする。test_tbl_01;SELECTの結果は以下のようになる。idには最初に1,2と連続した値が入る。TABLEすると値はリセットされる。文字列リテラルの問題SQLインジェクション脆弱性を快勝するにはSQLを組み立てる際にSQLの変更を防ぐことである。その具体策には以下の2つがある。プレースホルダによりSQL文を組み立てる。アプリケーション側でSQL文を組み立てる際に、リテラルを正しく構成するなどSQL文が変更されないようにする。bは完全な対応は難しく、aのプレースホルダを使用することを強く推奨する。PHPからDBを利用する場合、PEARのMDB2を推奨する。プレースホルダを利用すると先の蔵書検索のSQLは以下のようになる。holder)で、変数屋敷など可変パラメータの場所に埋め込んでおくものである。「場所取り」という意味。MDB2を利用してコードは以下のようになる(DBはPostgreSQL)。第2引数の配列でプレースホルダの方を指定する。切断?>プレースホルダプレースホルダには2種類の方式がある。静的プレースホルダプレースホルダを含むSQLがそのままDBエンジンに送られ、DBエンジン側でコンパイルされる。次にバインド値がDBエンジンに送られてDBエンジン側で値を当てはめられた後にSQL文を実行される。バインド値を入れる前にコンパイルされるのでSQLインジェクション脆弱性は原理的に発生ない。動的プレースホルダアプリケーションのライブラリ側で値をバインドしてからDBエンジンに送られる。リテラルは適切に処理されるので処理系にバグがなければSQLインジェクション脆弱性は発生しない。原理的にSQLインジェクションの可能性がない静的プレースホルダ方式の方が安全である。動的プレースホルダの実装の問題でSQLインジェクション脆弱性が発生した例がある。検査する場合はこれらの文字をエスケープする必要がある。このエスケープを怠ることとSQLインジェクションは別物だが混同している人が多い。自体を検索したい場合はESCAPE句を指定してWHERE句はいかのようになる。'#'DBエンジンによってエスケープが必要な文字は異なる。エスケープの必要がある。2012MySQLメモ015:設定ファイル書式MySQLの設定ファイルは、my.cnfである。