SSブログ

Firebird のデーターベースの文字コード [RDBMS]

IronPython + Firebird .NET Data Provider で、IBConsole みたいなツール作成中。
テストしてると
「arithmetic exception, numeric overflow, or string truncation」という例外が出る。
IronPython か .NET Data Provider か DataGridView の問題、もしくはそれらの組み合わせの問題かと思ってた。

ふと、例外メッセージをキーワードに Google君に聞いてみたら、↓違った。
http://homepage3.nifty.com/yamada_ken1/starthp/subpage11.html#005
例外の出るパターンでは、Firebird 1.0 で、データベースを EUCJ_0208 で作ってて、接続は UNICODE_FSS でやってた。動作としては おかしいので直すべきと思うけど、Firebird 2.0 でも直ってないみたい。
接続は UNICODE_FSS 固定でいいやと思ってたけど、接続するときも、Charset を気にしないといけないことが判明。うーむ。

ちなみに、IronPython + Firebird .NET Data Provider の組み合わせは、なかなか調子いいです。


SQL Server 2005 Express とSQL Server Management Studio Express [RDBMS]

諸般の事情により、SQL Server 2005 Express Editioin をインストールした。
http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=11350B1F-8F44-4DB6-B542-4A4B869C2FF1

これだけだと、管理ツールがないけど、↓のときに CTP だったツールが
http://blog.so-net.ne.jp/nakagami/2006-03-30-1
SQL Server Management Studio Express とかいうのになったみたいで、
http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796
リリースされてたのでこれもインストールした。

SQL Server 2000 の mdf/ldf ファイルをデタッチ→ 2005 でアタッチしたらそのまま使えてる(と思う)mdf ファイルだけでいいだろうと、ldfファイルを用意しないでアタッチしようとしたけど、できなかった。ツールの使い方をわかってないからかも知れない。

ちなみに 2005 → 2000 の向きに デタッチ→アタッチしようとしたら怒られてアタッチできなかった。

SQLServer 7→ SQLServer 2000 の時に同じようなことを書いたらしい(忘れてた)
http://blog.so-net.ne.jp/nakagami/2006-02-10-1

SQLServer 2000 の Enterprize Manager では、2005 の DB を開けなかった。ちょっとショック。
SQL Server Management Studio で 2000 の DB は(当然)開けたので、これからは
SQL Server Management Studio を使うようにしとけばいいのか?


NULL値を 0 として合計を出したり、日付→文字列変換したり [RDBMS]

合計を出そうと

SELECT SUM(bar) FROM foo


とすると、bar に NULL が含まれてると具合がよろしくない。
SQLServer だと、こんな感じ↓で、NULL の場合は 0 として合計が出せた。

SELECT SUM(IsNull(bar, 0)) FROM foo


IsNull(bar, 0) のところが Oracle だと NVL(bar, 0) PostgreSQL/Firebird だと COALESCE(bar, 0) ってすればいいみたい。

ついでに発見したので、日付と文字の変換についてもメモしておく
【日付型→文字列型変換】
[SQLServer] CONVERT(varchar, d,112)
[Oracle] TO_CHAR(d, 'YYYYMMDD')
【文字列型→日付型】
[SQLServer] CONVERT (datetime,'2006/09/29 10:20:30',120)
[Oracle] TO_DATE('2006/09/29 10:20:30','yyyy/mm/dd hh24:mi:ss')

PostgreSQL はこれ↓
http://www.postgresql.jp/document/pg814doc/html/functions-formatting.html
Firebird はこれ↓
http://firebird.skr.jp/?%C1%C8%B9%FE%A4%DF%B4%D8%BF%F4%B0%EC%CD%F7#cast

SQLServer の CONVERT 関数の最後のパラメータの 112 とか 120 ってこれ↓みたい。
http://www.microsoft.com/japan/msdn/sqlserver/sql2000/intlfeaturesinsqlserver2000.aspx


MT3.31+SQLite が遅いことについて [RDBMS]

MT なんてあんまり興味ありませんが・・・
http://as-is.net/blog/archives/001147.html
SQLite が悪いんじゃなくて、SQL 文の書き方が悪いんだよって話。
普通に JOIN するより(あの書き方をなんていうんだ?) LEFT JOIN した方が速い。
うーむ、言われてみればそうなのかと思うが
(LEFT はそのままにしとくより、共通した行だけ残すほうが時間がかかるってことなんだろうなぁ)
今までなんとなく LEFT JOIN を敬遠してた。以後気をつけよう。

ついでにメモしとく・・・
SQLite を C から使う
http://codezine.jp/a/article.aspx?aid=374
元祖サトシのブログの SQLite カテゴリ
http://www.randynetwork.com/blog/categorylist_html?cat_id=11
ユーザー定義関数
http://www.thinkit.co.jp/free/books/2/6/6/index.html
SQLite の日付関係処理
http://www.jmuk.org/d/?path=2005/12/01#d01t01


nice!(0)  コメント(1) 
共通テーマ:パソコン・インターネット

SQL 例文 [RDBMS]

SQL文って、シンタックスに直交性がないので、いつまでたっても、例文を見ないと書けない。
悲しいことに、リファレンスのメタ記法を見ただけじゃ例文が想像できない。
というわけで、自分へのメモとして 例文へのリンクをまとめておこう。

とりあえずこれだけ知っとけSQL
http://ash.jp/db/sql.htm

Firebird の SQL文(おぼえがき)
http://www005.upp.so-net.ne.jp/nakagami/Memo/FirebirdSQL.html

GROUP BY句/HAVING句 で集計
http://www.atmarkit.co.jp/fnetwork/rensai/sql03/sql1.html

逆引きSQL比較(←これいい!困ったら最初にこれを見るべし)
http://homepage1.nifty.com/kojama/works/rdbms/compare.html

JOIN を外部結合でしか使ったことないけど、等結合(INNER JOIN)で書く人も居るみたい
http://www.cyteen.nagoya-bunri.ac.jp/~kobashi/lec/DataBase/2001/2001_6.html
副問い合わせについては、↑のサブクエリー/相関サブクエリー/EXIST,ANY,ALL を読む
サブクエリー(副問合わせ)とは?
http://homepage1.nifty.com/kojama/works/rdbms/common.html#term06
相関サブクエリー(相関副問合わせ)とは?
http://homepage1.nifty.com/kojama/works/rdbms/common.html#term07

私も、最初に RDBMS を見たとき、(何がいいの?)と思った。
何がうれしいの?って思ったときに読むのには、「逆引きSQL比較」の[共通事項] がいいと思う
http://homepage1.nifty.com/kojama/works/rdbms/common.html

追記(6/23)
Web+DB Press 32号の特集 2 がよかった
http://www.gihyo.co.jp/magazines/wdpress/archive/Vol32
それをかいた人の会社の運営しているサイト↓の解説も例文として良い
http://www.techscore.com/tech/sql/index.html


nice!(0)  コメント(18) 
共通テーマ:パソコン・インターネット

MySQL と PostgreSQL の速度比較 [RDBMS]

http://www.thinkit.co.jp/free/article/0603/10/5/

めちゃくちゃ乱暴に言うと
・MySQL(ISAM) の方が PostgreSQL より 2.5 倍くらい早い
・MySQL(InnoDB)と PostgreSQL なら MySQL のが速いけど、ほとんど同じ
って感じだな。
ベンチマークなんて取ったことないし、そんなギリギリの性能について必要になったことないけど、なんとなく思ってたのと一致する。
ベンチマークを取る直前に Vaccum しているあたりで、 PostgreSQL の性能を割り引いてみてあげないといけないと思うが、あとは、2.5 倍の速度差を、差があると見るかどうかだな。

一ついえることは、アプリケーションの作りでそれ以上の差は付くってこと。
必要な回数の 100倍くらいクエリーを発行していて、せっかく MySQL を使っていても台無しにしていることも多々あると思う。
むしろ、RDBMS の性能を落とさないようにうまくプログラミングできてることのほうが少ない。
だから、実戦ではどっち使っても大差ないような気がする。

むしろ、ベンチマークを取った2つのバージョンで言えば MySQL の方は日本語の取り扱いに問題がありそうで使いたくないなぁ・・・とか、性能以外のところで考慮することがあるように思う。


nice!(1)  コメント(97) 
共通テーマ:パソコン・インターネット

SQLServer って、周辺のツールがすごい [RDBMS]

最近、SQLServer に、MS Access で接続して データーベースダイアグラムでDBをデザインしてるんだけど、やっぱり、MS のこういうツール類ってすごいなぁ。
GUI でデザインできて、変な制約をつけようとすると、「外部キー制約の連鎖更新が循環してますよー」と言ってくる。
日頃、Firebird なんかを使って、SQL文で制約を設定してるけど、効率が全然違う気がする。

テーブルの定義をグリッドシート上でできるのも、そこにコメントが付けられるのも、便利。
(日頃、そんなのはごまかしで、真の RDBMS の価値とは違うと言いつつも)

データーベースダイアグラムと、フィールドのコメントで、ドキュメントが大分省略できる。

こういうツールを OSS で作るのは無理そうだけど、
#こういうツールが作れる人は、こういうツールを必要としないジレンマ
Transact SQL をしゃべり SQLServer のふりをして、こういうツールでデザインできるようにOSS の RDBMS を改造するのって難しいんだろうか?
とふと思った。


nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

Firebird 2.0 の SEQUENCE の機能 [RDBMS]

Firebird 2.0 から SEQUENCE という機能が追加されて、
これからは、GENERATOR の代わりに使って欲しいということらしいけど、具体的な使い方がわからなかった。

いろいろ探して、それっぽい資料発見
http://www.ibphoenix.com/download/Firebird_v2Alpha02.ReleaseNotes_0200_20.pdf

シーケンスの作成
create sequence a_seq;

値の変更
alter sequence a_seq restart with 100;

値の取得
select gen_id(a_seq, 1) from rdb$database; で、1コ刻みに取得。
select gen_id(a_seq, 0) from rdb$database; で、現在の値を取得。

シーケンスの削除
drop sequence a_seq;

と、ここまでは GENERATOR と同じ。
きっと、内部的には同じ処理になってるんだろう。
GENERATOR でやってるようにトリガーの中で gen_id() で次の値を取得して設定しても、順序数を設定することもできる。

んで、 GENERATOR と違うのは、
トリガーを設定してその中で gen_id() で値を取得して設定しなくても
insert into employee (id, name) values (next value for a_seq, 'Alice')

とすると、カラム id に、順番に値が設定されるらしい。
これで、いちいちトリガーを設定しなくてもいいけど、
next value for ・・・って、変なシンタックスだなぁ。


SQLServer 2005 Express の周辺 [RDBMS]

SQLServer 2005 Express には Northwind データベースが付いていない
これ↓をダウンロードしてくればいいみたい
1. http://www.microsoft.com/downloads/details.aspx?familyid=06616212-0356-46a0-8da2-eebc53a68034&displaylang=en

SQLCMD というのを使えばいいのか?
2. http://msdn2.microsoft.com/ja-jp/library/ms170207(SQL.90).aspx

・・・しまった、「Microsoft SQL Server 2005 Express Manager」っていうのがあるらしい。
3. http://www.microsoft.com/downloads/details.aspx?familyid=82afbd59-57a4-455e-a2d6-1d4c98d40f6e&displaylang=en
CTP って書いてあるけど、これしかないみたい。

(追記)
1. のインストーラーを実行すると、ルートディレクトリに「SQL Server 2000 Sample Databases」
というフォルダができる。SQL 文と、 .mdf .ldf ファイルが存在する。
.mdf .ldf ファイルをアタッチしてもいいんだろうけど、
3. のツールをあらかじめインストールして、1. の instnwnd.sql をダブルクリックすると、 3. の
ツールが起動する。そこで Execute ボタンを押すと、SQL 文が実行されて、
無事 Northwind データベースができる。


nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット