2012年12月28日金曜日
SQLiteのメリッド
ちまたで多く使われているデータベースでは、MySQLやPostgreSQL(ポスグレ)なんでしょうけど、私は、SQLiteが好きだ。そして、私のように専用サーバを持たず、レンタルサーバのみの環境の方には、MySQL、PostgreSQLよりもSQLiteのほうが、絶対に幸せになれると思う。
データがファイルひとつなので、バックアップが超簡単!
SQLiteは、サーバー型でないため、データはたったひとつのファイルにまとめられている。バックアップするには、それをFTPでダウンロードするか、そのサーバー上でコピーするだけだ。MySQLでも、ツールを使えばバックアップはできるけど、ファイルのコピーだけで完結する簡潔さには、かなううまい。なお、ファイル名もなんでもよく拡張子もあってもなくてもいい。でも、バージョン2は.sqliteバージョン3は.sqlite3としている人が多いのかな。USBにデータファイルをコピーして、外出先のローカルサーバーで、すぐにSQLiteを使うなんて、当たり前にできる。MySQLでやろうとしたら気が遠くなる。-----DBのテーブル構成を変えたい?そう、なら、サーバーからダウンロードして、デスクトップのツールで変更して、ついでに入らなくなったデータ消去して、新たな更新データもいれておいて、アップロードすれば終わり。ローカルとリモートの同期が超簡単なのもDBがファイルだから。
多くのレンタルサーバMySQLよりも高速に作動する
レンタルサーバのMySQLの遅さに参っている人は多い。もっともこれはMySQLが悪いのでなく、レンタルサーバー業者が多くのアカウントをひとつのMySQLサーバーに押し込んでいるだけ。データベースサーバはサーバに大きな負担をかけるので、せっかくの早いと言われるMySQLが劇遅になってしまう例も見かけられる。それに対し、SQLiteはサーバー上の自分のスペースに置くだけなので、借りているWEBサーバさえまともならば、快適に使える。もちろん、WEBサーバも、共用であれば、MySQLのような副作用もあり得るわけであるが、SQLiteがサーバーに優しい動作であるので、多くの利点がある。なお、同じ環境では、MySQLと同じか、少し早いとのこと。WEBで検索すると書込が遅いという記事があるが、それはテスト方法を間違っているだけ(トランザクションを適切に使っていない)。
SQL機能的に問題ない
基本的なSQL文はすべて使える(SQL92準拠)。ここが(SQLite が認識できる SQL )詳しい。ビュー、トリガーもOK。check制約などが使えないが、それがないのがSQLiteなのだ。プロ中のプロが大規模サイトで使うには非力であっても、通常*1の使い方で問題となる面はでてこないであろう。
設定が容易。
パスワード設定がいらないので、MySQLを使ったことのある人ならば、「えっ、もう繋がるの?」とびっくりするだろう。
納入が容易。
私は関係ないが商売として、簡易的なデータベースシステムを使ってWEBシステムを構築しているのであれば、納入の容易さは、大きな利点となるだろう。なんせ、HTMLと同じコピペで納入できるのだから。ライセンスも心配ない。
PHP5では、SQLite3が標準で使える。PHP4でもSQLite2が標準で使える。
何もしなくても、いきなりプログラムを書けば自動的にデータベースファイルが作成される。標準バンドルはとてもありがたい。
データ型の概念が希薄であり、長さも柔軟、PHPと、とても相性がよい。
多くのデータベースサーバは、テキストの長さを決めなくてはいけなかったりする。(もちろんそうでない型もあるが、基本としてそうなっている。)SQLiteではchr(20)なんて必要ない。
無料であり、なんとコアソースコード著作権を主張していない。ライセンスの心配は一切いらない。
神様のような存在である。
容量が少なくて済む。コアは225Kbしかない。
rubyでもSQLiteが標準になった(そうだ)
rubyは使ったことないので、よく知らないけど。
(追記:ruby単体でなく、ruby on railsのデフォルトDBとして採用されたそうです。)
このように、多くの利点があるSQLite、使わない手はない。
私は特に 1 の利点は、ものすごく大きいと思う。外部サーバーから、FTPでダウンロードしてデータベースの中身をちょちょっと修正して、すぐにアップロードできる。なんて、MySQLでは絶対にできないでしょう。
一方で、こんなデメリットは知っておくべきだろう。
パスワード設定がない
ファイル形式であり、ユーザー管理の概念がないため、SQLite自身には、セキュリティ機能はない。自分で、ファイルへのアクセス権限をしっかりとコントロールする必要がある。サーバーのドキュメントルート以下に置く場合は、htaccessの設定が必須だろう。ドキュメントルートより上に置けば、外部の第三者からのセキュリティに問題があることはほとんどないだろう。
書込がダブると書込エラーになる
サーバー型でないので、複数の書込を順次処理することができない。最初の人が書込をしている間に、次の人が書込をしようとするとエラーになるので、そのケアーをする必要があるシステムもあるかもしれない。個人やSOHOのCMS(コンテンツマネジメントシステム)やブログ程度であれば、問題にあることはないだろう。読み出しはダブってもOK。頻繁に不特定多数がデータベースに書き込むような処理は苦手だろう。
バージョン2と3でデータベースの互換性がない。
2と3は別物と考えたほうがいい。PHPからのアクセスに限って言えば、SQLite2は、通常のsqlite_~関数を使ってアクセスするが、SQLite3は、PHP5.1以上で、かつ、PDOというデータベースドライバを通じてしか操作できないので、2->3のアップグレードは注意を要する。(そんなに難しくはないけど)。なお、PHP4,5でPDOを使わずにSQLite3を使う方法もあるようだが、PHP本体のリビルドが必要なようなことと、windouws環境が揃っていないことから、現時点(2008/1)ではお薦めできない。もちろんPDOを使えばアクセスできるので、皆さんPDOを使いましょう。
管理ツールでは、phpMyadminに劣るものしかない。
別記事で私の使っているツールをあげておきます。phpMyadminには及ばないが、しかし十分である。
日本語情報は、MySQLに比べて少ない。
皆さんで盛り上げていきましょう。ちなみに、SQLiteをやってみようは、よくまとまっておおられます。
SQLiteの基礎
コマンドラインツールでの入力方法
コマンドプロンプトから次のように実行するとSQLiteのコマンドラインツールが起動し、指定したデータベースに接続します。
sqlite3 データベース名
コマンドラインツール上では、SQL文を実行したり、コマンドラインツールに関する設定を行うようなSQLiteコマンドなどを実行することができます。
例えばSQLiteコマンドの「.show」を実行してみます。
今度はSQL文を実行してみます。
コマンドであればコマンドに加えて必要に応じて引数を入力してEntereキーを押すと実行されます。またSQL文であれば最後に「;」を入力されるまでが一つのSQL文として扱われますので、「;」まで入力を行ってからEnterキーを押す事で実行されます。
ただ特にSQL文では一つのSQL文が非常に長くなることがあります。全ての文を一度に入力しようとすると入力し難かったり、どこまで入力したか分かりにくい場合があります。
このような場合、コマンドラインツールでは分割して入力することができます。途中まで入力した時点でEnterキーを押して下さい。
SQL文は最後に「;」が現れるまでが一つの文のため、まだ入力の途中だと判断されると「...>」と表示されて続けて入力を行うことができるようになります。
では残りの部分を入力していきます。
この時、空白を一つあけて入力する必要はありません。コマンドの途中でEnterキーを押すと自動的に前と後の文は別の単語として扱われます。
SQL文の場合は「;」が含まれる文が入力されてEnterが押された時点で文の入力が完了したと判断されて実行されます。
まとめて入力しても分割して入力しても結果は同じなので場合に応じて使い分けて下さい。
SQLコマンドの場合
なお、SQLコマンドの場合は分割して入力することはできません。例えば「.mode」コマンドは引数を一つ指定しますが、引数を指定しない時点でEnterキーを押すとエラーとなります。
SQLコマンドの場合は分割して入力を行わずに最後まで入力を行ってから実行して下さい。
SQLiteでは多くのキーワードが定義されています。例えばTABLEやSELECTといった言葉はキーワードです。キーワードは予約語とも呼ぶ場合があります。
テーブル名やデータベース名は識別子と呼ばれます。識別子にはアルファベットや数字などを組み合わせて付けることができます。(例えば「booktable」や「name」など)。ただしキーワードはそのままでは識別子として使用することができません。
識別子とキーワード
キーワードを識別子と使用したい場合には、次の4つのいずれかの方法を使います。
'keyword'
"keyword"
[keyword]
`keyword`
シングルクオーテーション(')でキーワードを囲った場合、文字列の値として扱われます。識別子を記述すべきところにシングルクオーテーションで囲んだ文字列の値を記述すると識別子として扱われるためこの形式でも指定することができます。
ダブルクオーテーション(")、角括弧([])、グレイヴ・アクセント(`)でキーワードを囲った場合、識別子として扱われます。(なお文字列を記述すべきところにダブルクオーテーションで囲んだ識別子を記述すると文字列として扱われます)。
なお角括弧はAccessやSQL Serverで使われている方式でグレイブ・アクセントはMySQLで使われている方式です。この2つの方式はそれぞれのデータベースとの互換性を保つために用意されています。
以上のことからキーワードを識別子として使用するにはダブルクオーテーション(")で囲むようにしておけばいいかと思います。
キーワードの一覧
キーワードを識別子として使用するための方法を記載してきましたが、SQLiteでは多くのキーワードでクォートしなくても使用できるようになっています。
例えば「TEMP」はキーワードの一つですが、クォートしなくてもテーブル名として使用することができます。
ただクォートしないで使用すると分かりにくくなり不要な間違いを起こしかねません。またそれ以前の問題としてキーワードを識別子としてあまり使用しない方が望ましいと思います。
下記にキーワードの一覧を記載します。必ずクォートが必要なキーワードと、必要でないキーワードに分けて記載します。
クォートが必須のキーワード:
ADD
ALL
ALTER
AND
AS
AUTOINCREMENT
BETWEEN
CASE
CHECK
COLLATE
COMMIT
CONSTRAINT
CREATE
CROSS
DEFAULT
DEFERRABLE
DELETE
DISTINCT
DROP
ELSE
ESCAPE
EXCEPT
EXISTS
FOREIGN
FROM
FULL
GROUP
HAVING
IN
INDEX
INNER
INSERT
INTERSECT
INTO
IS
ISNULL
JOIN
LEFT
LIMIT
NATURAL
NOT
NOTNULL
NULL
ON
OR
ORDER
OUTER
PRIMARY
REFERENCES
RIGHT
ROLLBACK
SELECT
SET
TABLE
THEN
TO
TRANSACTION
UNION
UNIQUE
UPDATE
USING
VALUES
WHEN
WHERE
クォートが不要のキーワード:
ABORT
AFTER
ANALYZE
ASC
ATTACH
BEFORE
BEGIN
BY
CASCADE
CAST
COLUMN
CONFLICT
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
DATABASE
DEFERRED
DESC
DETACH
EACH
END
EXCLUSIVE
EXPLAIN
FAIL
FOR
GLOB
IF
IGNORE
IMMEDIATE
INDEXED
INITIALLY
INSTEAD
KEY
LIKE
MATCH
OF
OFFSET
PLAN
PRAGMA
QUERY
RAISE
REGEXP
REINDEX
RELEASE
RENAME
REPLACE
RESTRICT
ROW
SAVEPOINT
TEMP
TEMPORARY
TRIGGER
VACUUM
VIEW
VIRTUAL
システムで使っている識別子
下記の識別子はキーワードではありませんが、SQLiteシステムが使用している識別子です。他のテーブル名などに識別子として使うことも可能なようですが、使用しないほうがいいと思われます。
_ROWID_
MAIN
OID
ROWID
SQLITE_MASTER
SQLITE_SEQUENCE
SQLITE_TEMP_MASTER
TEMP
SQL文でのコメントの記述
SQLiteでSQL文にコメントを記述するには次のいずれかの方法を使用します。
-- コメント
/* コメント */
コメントは単なるメモであり、SQL文の実行時に無視されて何も影響を与えません。
「-- コメント」の形式でコメントを記述した場合、「--」から行末までに記述された文字列をコメントとします。
「/* コメント */」の形式でコメントを記述した場合、「/*」から「*/」までに記述された文字列をコメントとします。
なおコメントを付けてINSERT文を実行しても、「.dump」コマンドでダンプした内容にはコメントは残っていません。
その為、コマンドツール上でコマンドを記述してもあまり意味はありません。
単語
欺く あざむく
焦る あせる
褪せる あせる
促す うながす
敬う うやまう
うんざりする
煽てる おだてる
脅かす おびやかす
帯びる おぶる
嵩む かさむ 増加
合致する がっちする
かぶれる 皮膚が赤くはれてかゆくなる
鍛える きたえる
食い違う くいちがう 一致ではない
潜る くぐる
覆す くつがえす
マーケティング・コンサルティング
試みる こころみる
拗れる こじれる
誤魔化す ごまかす
凝らす こらす
懲りる こりる
遮る さえぎる
さえずる 鳥の音
冴える 冴える 冷え込む、光・音・色などが澄み切る、
妨げる さまたげる
障る さわる
試験をしくじる、会社をしくじる、得意先をしくじる
慕う したう
萎む しぼむ
廃れる すたれる
リファクタリング
焦る あせる
褪せる あせる
促す うながす
敬う うやまう
うんざりする
煽てる おだてる
脅かす おびやかす
帯びる おぶる
嵩む かさむ 増加
合致する がっちする
かぶれる 皮膚が赤くはれてかゆくなる
鍛える きたえる
食い違う くいちがう 一致ではない
潜る くぐる
覆す くつがえす
マーケティング・コンサルティング
試みる こころみる
拗れる こじれる
誤魔化す ごまかす
凝らす こらす
懲りる こりる
遮る さえぎる
さえずる 鳥の音
冴える 冴える 冷え込む、光・音・色などが澄み切る、
妨げる さまたげる
障る さわる
試験をしくじる、会社をしくじる、得意先をしくじる
慕う したう
萎む しぼむ
廃れる すたれる
リファクタリング
2012年12月24日月曜日
株式会社ノアテックを設立しました
情報システムをご利用になるお客様の立場に立ち、企画・提案から運用・保守まで一貫したソリューションをご提供する。
これまでに育ってきた技術力を一層高め、常に情報リテラシーを磨き、顧客満足度を重視しながら、より良いシステム開発とソリューションの提供に全力を尽くして、可能な限りの社会貢献を果たして参ります。
よろしくお願いします。
株式会社ノアテック
www.noah-tec.com
これまでに育ってきた技術力を一層高め、常に情報リテラシーを磨き、顧客満足度を重視しながら、より良いシステム開発とソリューションの提供に全力を尽くして、可能な限りの社会貢献を果たして参ります。
よろしくお願いします。
株式会社ノアテック
www.noah-tec.com
柠檬的错觉
1.爱是世界上最甜蜜的痛,痛是为了得到世界上最甜蜜的爱.
2.其实不想写,其实不想回忆,其实我希望永远记不起. 但痛苦一天天积累,希望一天天枯萎. 脑海里浮现着但丁的神曲, 总以为那是很久远的过去,没想到那竟是熟悉的回忆. 总以为那是很漂渺的唏嘘,想不到也有现实的异域.
3.在爱的路上潇洒的我,遇到了比我更潇洒的你. 我像潇洒的风,你像潇洒的雨. 风雨之中,我发现自己潇洒地爱上了你.
4.我把你放在一滴泪里,幻想千年以后化成琥珀. 我不敢低头,怕那滴眼泪滴落,碎了千年的梦.
5.梦醒之后,注定要启程,单薄的身影,沉重的脚步,都取代来时那轻盈的步伐. 让我离开这虚假的天空,深深的脚印刻印下你给的伤痕累累. 红肿的双眼,颤抖的双肩,都证实着伤寂的泪水. 但愿他能酿一杯涩酒,在每一个想你的深夜品尝.
6.孤独,这是为自由付出的代价. 潇洒,这是孤独的外衣. 7.人生若只如初见,春风扑面桃花艳. 人生若只如初见,何事秋风悲画扇.
2.其实不想写,其实不想回忆,其实我希望永远记不起. 但痛苦一天天积累,希望一天天枯萎. 脑海里浮现着但丁的神曲, 总以为那是很久远的过去,没想到那竟是熟悉的回忆. 总以为那是很漂渺的唏嘘,想不到也有现实的异域.
3.在爱的路上潇洒的我,遇到了比我更潇洒的你. 我像潇洒的风,你像潇洒的雨. 风雨之中,我发现自己潇洒地爱上了你.
4.我把你放在一滴泪里,幻想千年以后化成琥珀. 我不敢低头,怕那滴眼泪滴落,碎了千年的梦.
5.梦醒之后,注定要启程,单薄的身影,沉重的脚步,都取代来时那轻盈的步伐. 让我离开这虚假的天空,深深的脚印刻印下你给的伤痕累累. 红肿的双眼,颤抖的双肩,都证实着伤寂的泪水. 但愿他能酿一杯涩酒,在每一个想你的深夜品尝.
6.孤独,这是为自由付出的代价. 潇洒,这是孤独的外衣. 7.人生若只如初见,春风扑面桃花艳. 人生若只如初见,何事秋风悲画扇.
PL/SQL 勉強ノート
1.
declare
type empno_array is table of varchar2(3);
tep empno_array := empno_array('E01','E02','E03','E04','E05');
begin
-- 配列の最後の要素を削除
tep.trim;
for ep_cnt in 1..tep.count loop
dbms_output.put_line('ep1:' || tep(ep_cnt));
end loop;
-- 配列の最後の要素を2つ削除
tep.trim(2);
for ep_cnt in 1..tep.count loop
dbms_output.put_line('ep2:' || tep(ep_cnt));
end loop;
end;
declare
type empno_array is table of varchar2(3);
tep empno_array := empno_array('E01','E02','E03','E04','E05');
begin
-- 配列の最後の要素を削除
tep.trim;
for ep_cnt in 1..tep.count loop
dbms_output.put_line('ep1:' || tep(ep_cnt));
end loop;
-- 配列の最後の要素を2つ削除
tep.trim(2);
for ep_cnt in 1..tep.count loop
dbms_output.put_line('ep2:' || tep(ep_cnt));
end loop;
end;
登録:
投稿 (Atom)