ラベル Oracle の投稿を表示しています。 すべての投稿を表示
ラベル Oracle の投稿を表示しています。 すべての投稿を表示

2007/12/06

Oracle 10g Express Edition でチト困った

Oracle 10g Express Edition は

  • AL32UTF8
  • WE8MSWIN1252

のみのCHARACTER SETしか使用できない

資料:
Oracle® Database Express Edition
10 Oracle Database XE Character and Language Configurations


これで非常に困った。

現在数社で連携をとってWebアプリを開発しているのだけど、
他社が作った機能の検証用テストデータとしてINSERT文が書かれたSQLファイルを送付してもらった。

いざINSERTしてみると、
ORA-12899:
列"hoge"."foo"."bar"の値が大きすぎます
(実際: 60、最大: 40)

とOracleに怒られ、データが入らない箇所がある。

慌てて文字数をカウントしたが、データに間違いはない。

これはなんだ?と思ったところで、
思い当たったのが、DBモデルのバージョンが違うのではないか?ということ

誤解を招く言い方かもしれないので補足を書くと、
上記の違いとはDBのバージョンが違うという意味ではない、
今回のプロジェクトでは(あってはならないことなんだけども)、
客先要求の追加などで、テーブルの名前が変わったり、テーブル自体が消えてたりなどの数回のモデルチェンジが行われているのだ。

そして何度かデータの最大文字数も変更されている。

数社で連携をとって開発している中でのモデルチェンジだったので、
もしかしたら各社でバージョンが違うのではないのか?
そのバージョンでは文字数定義が違うのではないか?と思った。

細かい敬意を省くために結果を述べると「モデルのバージョンは同じ」だった。

原因は弊社と他社のDBの差にあったのだ。


私の会社ではWindows版のOracle10gサーバーが見つからなかったので、
他社検証用として急いでOracle10g Express Editionを導入した。

無料で使える10gということでワクワクしながら環境構築していったのだが、
構築過程でサービス名が一つしか設定できないことを知る。

まぁこれは、今回プロジェクト限りで潰してもいいDBなので、問題はない。


それから上記の問題の発生である。
XEのインストールウィザードで文字コードの選択が出てこなかったので考えてなかったのだけど
(浅薄だなぁ・・・)

文字コードの差が問題だということが結果としてわかった。

現在Oracle10g正式版は何種類かの文字コードをカバーしている。
そしてデフォルトインストールすると、文字コードはSHIFT_JIS(JA16SJIS)になるのだが、

10gXEはUTF8(AL32UTF8)がデフォルトだ、
仕様書 を見ると、WE8MSWIN1252というコードも選択出来るそうなのだがこの文字コード自体初見である。

じゃあ、何が困るのか?

プログラマな人はとっくに原因なんて分かっていると思うけど、
プログラマじゃない人も世の中にはいるわけで・・・説明を続けると、

どうやら今回のプロジェクトにおいて10gを使用している所はすべてSHIFT_JISで設計されている。
(日本国内のイントラネット的なWebシステムなのでこれはまぁ、いいんじゃないかな・・・怒る人もいるだろうけど)


そうすると型VARCHAR2での日本語全角20文字MAX文字数の設計のは

VARCHAR2 = 40[Byte]

これは日本語の出力には2byte分のデータが必要なので文字数2倍としただけである。


さて、DBのCHARACTER SETがUTF8だった場合。
日本語全角20文字は
VARCHAR2 = 60[byte]

となる。UTF8はマルチバイト文字であり、
多言語をカバーするため1byte文字以外の出力に2~6byte分のデータが必要になる。
日本語の全角文字に必要なデータは3byteである。
よって文字数3倍とした。

さて、私は10gXEと10g正式版の違いを意識せずに提供されたCreateTable文を走らせた。


条件は揃ったので、最初の問題に戻ろう。

SHIFT_JISで設計されたテーブルデータをUTF810gXEにCreateし、
全角20文字のDBのフィールド用に作られたテストデータをINSERT文で突っ込むと、

DB側は設計上VARChAR2(40byte)という情報と、
入力された全角20文字のテストデータを見比べて

全角20文字を60byteデータと解釈し、入力者側に

ORA-12899:
列"hoge"."foo"."bar"の値が大きすぎます
(実際: 60、最大: 40)


というエラーを返す。


結論 : こっちが悪い。

2007/10/29

Oracle 10g Express Editionのインストールメモ

Oracle備忘録
仕事のテスト環境用にOracle 10g Express Edition(Oracle 10gの無料版)を使用する機会があったのでそのインストールメモ

Oracle : Oracle 10g Express Edition
OS : WindowsXP

とりあえずExeファイルを実行してインストール
サクっと終了

インストール中にはSYSTEMのパスワードだけ設定。

とりあえずSYSTEMでログイン
後、新規ユーザー作成
ここではFOOとしておく。

これでとりあえずはスキーマ作成完了。

次に他PCよりOracleに接続を試みる。

  1. まずはIPを固定
  2. ついでにOracle Clientをインストール
  3. 次に
    「すべてのプログラム」→「Oracle - OraClient10g_home1」
    →「コンフィグレーションおよび移行ツール」
    →「Net Configuration Assistant」を選択

後は以下のとおり

ローカルネットワークサービス名構成を選択。

追加を選択

EXpressEditionはサービス名がデフォルトで定められており、
複数設定することはできない様子。
デフォルト名は「XE」

TCPを選択

Oracle 10g Express EditionをインストールしたPCのローカルIPを入力

後は接続設定をして開発者と猫の名前を除去して。
自分が作ったスキーマ名とそのパスを入力してテスト成功すればOK!

注意点
Oracle DataBase を入れているPCのファイヤーウォールの1521ポートをあけておくこと

2007/02/07

銀への道

昨日からヘルシア緑茶一日一本のみはじめました。

これは特定保健用食品なので、飲み続ければ効果があるはず!
(それより運動したほうがいいけどね!)

くそまずいお茶に顔をしかめつつOracleのHPを調べました。


Oracle Silverに関して調べた結果

Oracle Silverを取得するためには

  • Oracle Bronze DBA 10g
  • Oracle Bronze SQL基礎Ⅰ
  • Oracle Silver DBA 10g

の3つを順不同で取得した場合、Silverの認可が下りるみたいだ。

む~ん・・3月末には取得したいと思っていたSilverだがちょっと無理そうだ。

なので、Bronzeからきっちりたたき上げてとっていく計画を立てよう。

ざっくり計画
Bronze SQL基礎Ⅰ: 2週間
Bronze DBA 10g : 2週間
Silver DBA 10g : 一ヶ月

とゆーわけで、順調にいけば
3月12日にBronze
4月15日にSilverをゲット!

とりあえず、業務で使用しているBronze SQLをまず目標にして取得しよう。
話はそれからだ!