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]
ニアリーイコールと一般人
システムの外部設計書(お客さんに見せる設計書)を
パートナー会社さん(別会社で一緒に同じプロジェクトをしているところ)
に送付し、一仕事終えてぼけ~っとしてると、
その会社のリーダーさんからお電話がきた。
開口一番「おかしない?」
「なにがです?」
(ボーっと、してたので脳みその用意が出来てない)
「この記号ここに使うもんじゃないやろ?ほら・・・の・・・の式に書いてある」
「はいはい・・・少々お待ち頂けますか?」
(慌てて資料を探す)
「ああ・・・いや、えーっと何がおかしいのでしょうか?」
リーダーの指摘箇所は
今回システムを作成している会社の物流で
納品数を算出する項目。
[式] :[Foo] / [Bar] = [hoge] (小数点以下切捨て)
(※項目名を出すとマズいので適当な当て字で代用。)
と私の設計書には書いてあった。
要するに、ある項目と別の項目の数を除算して、
その答えは整数値にしてくださいねーってだけの話。
で、この数字が物流的に特別な意味合いを含んでいた重要な数字だったので、
例として実際のデータを入れたケースを設計書に一緒に書いていたのだけど。
その例として、
[Foo] = 3000
[Bar] = 990
3000 / 990 = 3.03030・・・ ≒ 3
以上より [hoge] = 3
という例式があった。
この箇所にクレームがきたのだ。
具体的に何かというと「≒」の使い方である。
これをこういう使い方をするべきではないときたのだ。
こっちの反応としては
「なんで?」
である、≒(ニアリーイコール)の使い方として
無限小数を集約するものとして使用するのは間違いではない。
どうも話を聞いていると、相手側の主張が
「≒」は近似値をあらわすものだから、
小数点以下切り上げに使用するべきじゃない。
ふむ、小数点以下切り上げとしては確かに
3000 / 990 = 3.03030・・・ = 3 (小数点以下切捨て)
と書くのもアリアリだ。
う~ん、細かい話だが波風立てるほどのものでもないし、
相手に合わせておくか・・・
とここで、横で電話の様子を見ていた先輩が一言
「多分、一般人の人には”≒”って何の事かわからんかもよ?」