SQLと仲良しに
昔はだいぶ難儀しましたが、phpMyAdminができてからはラクチン。
わからないSQLに触れることもなくなりました。
が、自分で組む場合にはそうはいかないですね。がんばる。
で、最初につまったのはtinyintとsmallintとintの使い分け。当然違いはわかりますよ。その違いにしたがって使い分ければいい。けど使い分ける必要性がわからない。
データの格納量が違うのは当然わかります。
しかし今ストレージがタダみたいな値段になっていることを考えれば、大した理由にならないし。
なんか効率が落ちるなら、ちゃんと使い分けようと思うけど、ちゃんとそう書いているものがみつからない(検索すると2chのログとかならひっかかるけど、それ以外速度に影響する旨書いているものがみつからない)。
むしろ、以下のようにあります。
ディスクやメモリ容量が飛躍的に大きくなった現代において、わずかなデータサイズを惜しんでばらばらにするよりは、統一によりミスを少なくする方が勝ると考えています。
▽ 使用するデータ型を統一する (ThinkIT)
http://www.thinkit.co.jp/cert/tech/31/3/4.htm
まぁけど、ディスク容量はともかく、メモリは気になる……かな……(共用サーバだし)。
そのうちちゃんと知りたいと思います。
とりあえずテーブルの作成等のSQLは、以下のサイトをみながら意味を確認しつつ書いてみました。
▽MySQL初心者入門講座: Step1・データベースとテーブルの作成
http://mysqlweb.net/category/3998126-1.html
▽PHPプログラミング初心者入門講座: Step1・MySQLの準備
http://php5.seesaa.net/category/4044520-1.html
まずはRSSのpubDateを、MySQLのdatatimeに格納できるように変換。
strtotime()で一度Unixタイムスタンプにして、date()で書式を変更すると。
▽PHPでpubDateをタイムスタンプに変換する方法
http://paranoids.sakura.ne.jp/kaworu/2007-10-16-1.html
▽PHP関数講座:date -- そふぃのphp入門
http://nyx.pu1.net/function/datetime/date.html
ここまできて、foreach()って繰り返しだよね?と思いつつ、念のため確認。
▽PHPスクリプト講座:foreach -- そふぃのphp入門
http://nyx.pu1.net/reference/control/foreach.html
そしてSQLでデータを挿入。
識別用にIDというカラムを設けて、連番を振ろうとするもよくわからず……。
mysql_insert_id() という関数をみつけました。しかし「直近で実行された Insert 文を対象にAUTO_INCREMENT値を返」すので、これからInsertしようとしているのにどうするのよ?と頭を抱える始末。
AUTO_INCREMENT値という意味がわからなかったゆえだったのですね。属性としてAUTO_INCREMENTを指定してしまえば、オシマイ、でした。答えがわかれば単純也。
▽MySQLのAUTO_INCREMENTで生成された値を簡単に取得する方法 :: Webプログラマー+WebデザイナーなZARU日記
http://blog.tofu-kun.org/071206185929.php
▽MySQL MySQL 4.1 リファレンスマニュアル 3.6.9 AUTO_INCREMENT の使用
http://dev.mysql.com/doc/refman/4.1/ja/example-auto-increment.html
最後に、データをMySQL内に格納するも、日本語部分が文字化け。
phpのコードも、元データも、MySQLもUTF-8なのに、あれ〜?って感じ。
▽MySQL自体が文字化けするときは SET NAMES (文字コード) で対処しよう! (PHPの知恵工房)
http://kuppo.sakura.ne.jp/php/db_set_names.php
そうでした。OpenPNEや、Xoopsの際にもあれこれ悩んだのでした。
MySQL 4.1以降の文字コード自動変換が原因でした。
▽PHPからSET NAMESを使わない方が良い理由と対策まとめ (twk @ ふらっと)
http://nonn-et-twk.net/twk/why-set-names-in-php-is-bad
mysql_client_encoding()で、設定されている文字コードを確認。
案の定、latin1と表示されました。
これでほぼ第1段階はクリアかな