SQLiteの連番生成

2008/10/09 | SQLite

最近は結構SQLiteを使うことが多い。PHP5という前提はあるけれど(もちろん条件がそろえばPHP4でも大丈夫なんだけど)。レンタルサーバを使う際に、MySQLの場合はデータベースの個数に制限がある場合がほとんどだけど、SQLiteなら何個データベースを作ってもOKだから気兼ねなく使える。

でもいまだに慣れないところもある。バージョン2系と3系の違いがあるのかもしれないけれど(いろいろ試したわけではないのでよくわからない)、バージョン2で連番生成させたいときの条件が難しかった。単にデータベースの操作ツールがsqliteManagerだったからわかりにくかったのかもしれないけれど。連番生成のための条件をメモしておく。

  • 主キーであること
  • データ型がINTEGER
  • サイズを指定しない
  • NULL許可

このカラム設定にしておいて、データのINSERT時に主キーをNULLで登録すればOK。

PHP4系だと、どうしてもSQLite2系を使わないといけない場合があって面倒だ。PHP5系ならSQLite3系で、管理ツールにFireFoxのプラグインの「SQLite Manager」を使って問題なくいろいろな操作ができるんだけど(しかし管理ツールの名前が同じってのは区別しにくい)。

SQLite2のテーブル修正

2008/04/07 | SQLite

「便利に使えそう」と期待しているSQLiteだが、もろもろウェブを検索すると「断然SQLite3にすべき」という記述が多い。当然多機能だろうかバージョンが上のほうがいいに決まっているのだが・・・。
SQLite2の場合、本来は一度作ったテーブルの修正はできないらしい。つまりalterコマンドがないのだ(SQLite3から実装されたらしい)。これは確かに不便だ。
SQLiteManagerではいちおうSQLite2でもテーブルでカラムの追加や削除、修正ができる。これは以下の手順を踏んでいるらしいことがわかった。
(1) 元テーブルと同じ構造のテンポラリテーブルを作成
(2) テンポラリテーブルに元テーブルのデータを挿入
(3) 元テーブルを削除
(4) 希望のテーブルを新規で作成
(5) テンポラリテーブルに入れたデータを新規作成テーブルに挿入
(6) テンポラリテーブルを削除

上記の操作をトランザクションに囲んで処理させているようだ(本当はどうだかソースを読んでいないのでわからないけれど)。トランザクションをサポートしているのにテーブルの修正ができないとは・・・。まぁトランザクションのほうがあったほうがいいけれど、それでもテーブルの修正が容易でないというのは開発段階では致命的。

でもPHP5ではデフォルトではSQLite2しかサポートしていない。しょうがなしにSQLite2を使っていくということになるのだが・・・。早めに改善を希望する部分だな。

PHP4でSQLiteManagerを使う際に

2008/04/06 | SQLite

SQLiteManagerを活用してがんばってSQLiteを使っている。PHP4でSQLiteが使える環境があったのでそちらにも設置してみた。基本的には動作しているようだが、なぜかUTF-8化を実施すると以下のエラーが出る。

Warning: cannot yet handle MBCS in html_entity_decode()

htmlentity関連のエラーだ。マルチバイト文字はhtmlentity関数との相性がよくないような気がする。さて、これを解消する方法は以下の通り(include/common.lib.phpを修正)。

(1) 上記ファイルのどこか適当なところに以下の関数を記述する。
function unhtmlentities($string)
{
  $string = preg_replace(‘~&#x([0-9a-f]+);~ei’, ‘chr(hexdec(“¥¥1″))’, $string);
  $string = preg_replace(‘~&#([0-9]+);~e’, ‘chr(¥¥1)’, $string);
  $trans_tbl = get_html_translation_table(HTML_ENTITIES);
  $trans_tbl = array_flip($trans_tbl);
  return strtr($string, $trans_tbl);
}

(2) 元ファイル中で133行目、180行目、184行目ででてくるhtml_entity_decode関数を上記のunhtmlentities関数で書き換える。その際2つ目以降の引数はばっさり切り取る。

以上でOK。正しく表示された。多分標準の関数を自前処理の関数で置き換えた、ということだろう。

SQLiteはPHP4でも使えるかも

2008/03/17 | SQLite

SQLiteはPHP5から標準で使えるようになった機能だ。しかしPHP4でも使える場合がある。

どんな具合になっているのか。

SQLite関連はPECLライブラリで開発されていたので、モジュール拡張されていれば使用できるということになる。つまりモジュール「sqlite.so」が組み込まれていればいい。これを確認するにはphpinfo()関数を実行するのが手っ取り早い。

表示された中でsqliteがあればOK。

たいていの共用レンタルサーバではMySQLが使用可能だけど、作成できる個数が限定されていることが多い。つまりデータベースが無制限に作成できるわけではないから、自ずとひとつのデータベースの中でプレフィックス文字列を変更するなどして使うことになるのだが、必然的にテーブル数が増えて視認性・操作性が悪くなる。SQLiteの場合は単にファイルを生成するだけだから、容量さえ契約の上限を守っていればいくつでも作成可能なわけだ。つまり作りたいだけ作ることができる。これは魅力的だ。

自分にとってはファイルひとつコピーするだけでバックアップできるところが一番の魅力でもある。

そんなお手軽なSQLite。PHP5が一般的になって、対応アプリが増えれば絶対に流行るとは思うのだが・・・。

SQLiteの文字コード

2008/03/12 | SQLite

SQLiteなんて比較的新しいのだから言語なんてUTF-8で当然!、とか思っていたら全然そんなことないようだ。もちろんSQLiteは多言語対応しているが、SQLite ManagerではEUC-JPしか使えないようだ。
やっぱりUTF-8で使いたい訳なのだが、すでに有名どころな方がUTF-8を使えるようにしてくれていた。さすが。

よくきたblog

まず以下のリンクで必要ファイルをダウンロードする。
ファイル

そしてinclude/defined.inc.phpを修正する(下記の配列の14番目を追加)。

$availableLangue = array(  1=>’french’, 2=>’english’, 3=>’polish’,
        4=>’german’, 5=>’japanese’, 6=>’italian’,
        7=>’croatian’, 8=>’brazilian_portuguese’, 9=>’dutch’,
        10=>’spanish’, 11=>’danish’, 12=>’traditional_chinese’,
        13=>’simplified_chinese’,14=>’japanese_utf8′);

これだけでオッケー。言語の選択画面でいったんjapaneseを選択すると、以降の画面でUTF-8が選択できるようになった。
これでやっと目的どおりの環境になった。SQLiteは何がいいって、バックアップとるのが簡単。何しろ単なるファイルだからね。チャンスがあればこれからバリバリ使う予定だ。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net