Sidebar |
sqlite2からsqlite3に移行していると
いくつかの不具合を発見してしまった。 とりあえず、教えたけど 直るかは不明。 ソースを10分くらい解析すればパッチくらい作れるけど レンタルサーバーでは通用しないというか面倒なので 対処法で解決するほうが無難。 sqlite3のSELECT 文 評価の際の内部バグ。 一つ紹介しておこう "列名"が必ず""列名""でくくられて変更されてしまう欠陥。 もし、遭遇した場合は、 回避するには、SELECT "列名" as '新しい名前'で回避するしかない "列名"を使い countやsumなどを使った場合に注意が必要だ。 ※version2には、この欠陥は存在しない 追記 移行完了 確かに、説明にあるようにDBファイルが小さくなって速くなった気がする。 また今後、ドライバ関数の変更に振り回されないように 共通の独自クラスを作って、その中で、PDOとSQLite3クラスを判別して処理するように工夫をした。 今後なにか別のクラスが発生した場合は関数10個程度に、追加・書き込みするだけで済む。 SQL文とその関数を修正しなくて済むようになったので、かなりいい。 公式サイトのformatchng.htmlには、2と3は、完全に互換性がないと書いてあります。
ということで、変換が必要になります。 公式サイトから、sqlite.exe sqlite3.exeをダウンロードします (※sqlite.exe(sqlite-2_8_17.zip): ソース sqlite-2.8.17.tar.gz) コマンドプロンプトなどで 変換するコマンド 直接生成する場合 sqlite.exe old.db .dump | sqlite3.exe new.db 一度テキストに保存したい場合 sqlite.exe old.db .dump > old_db_dump.sql ここで、必要に応じて、old_db_dump.sqlを修正します sqlite3.exe new.db < old_db_dump.sql ※問題点 sqlite.exe(2.8.17) のダンプがキーワードをエスケープしない欠陥があるので 定義済みキーワードを使ったテーブル、列名などがある場合、 取り込みでエラーを起こす可能性があります その場合、一度テキストにダンプして一括修正後、取り込みが必要になります sqlite3.exeのダンプでは、問題ないようです。 例 sqlite.exe のダンプ: INSERT INTO item VALUES(1); 例 sqlite3.exe のダンプ: INSERT INTO "item" VALUES(1); 例: create table "where" (id text); INSERT INTO "where" VALUES(1); 追記 sqlite.exe(sqlite 2.8.17)のパッチ sqlite-2.8.17-47fee16ba9bd8ab2.diff --- SQLite-47fee16ba9bd8ab2/src/shell.c 2007-01-08 16:20:28.000000000 +0900 +++ SQLite-47fee16ba9bd8ab2/src/shell.c 2010-11-04 23:00:00.000000000 +0900 @@ -421,7 +421,7 @@ p->zDestTable = 0; } if( zName==0 ) return; - needQuote = !isalpha(*zName) && *zName!='_'; + needQuote = *zName!='_'; for(i=n=0; zName[i]; i++, n++){ if( !isalnum(zName[i]) && zName[i]!='_' ){ needQuote = 1; 追記: 2011.12 バイナリデータを含んでいた場合、DUMPに失敗することがわかりました。 patch2を作りました。 別記事になります。 sqlite patch p2 で検索してください。 |
Sidebar |