SQLと仲良しに

昔はだいぶ難儀しましたが、phpMyAdminができてからはラクチン。
わからないSQLに触れることもなくなりました。


が、自分で組む場合にはそうはいかないですね。がんばる。


で、最初につまったのはtinyintsmallintintの使い分け。当然違いはわかりますよ。その違いにしたがって使い分ければいい。けど使い分ける必要性がわからない。


データの格納量が違うのは当然わかります。
しかし今ストレージがタダみたいな値段になっていることを考えれば、大した理由にならないし。


なんか効率が落ちるなら、ちゃんと使い分けようと思うけど、ちゃんとそう書いているものがみつからない(検索すると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


あとはSQLをたたき込めるように、php側の準備ですね。

まずは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のコードも、元データも、MySQLUTF-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段階はクリアかな