[前][次][番号順一覧][スレッド一覧]

mysql:435

From: Satoshi Koiwa <Satoshi Koiwa <koiwa@xxxxxxxxxx>>
Date: Wed, 9 Dec 98 20:57:47 +0900
Subject: [mysql 435] Re: CREATE TABLE 句についての質問


毎度私は民斗さんの反応の速さに仰天しております。

>MS ACEESS等にテーブルをリンクすると、文字列は左詰で表示されています。INT
>だと右詰で表示されています。(NUMBER型は左詰です)
>このことからNUMBER型は数値しか入らない文字列のことではないかと、推測して
>おります。

MS ACCESSは、まぁ、よくわからんのでパス(はははは)。
OracleのNUMBER型というのは確かに「数値しか入らない文字列」という扱いだと認
識しています。そしてMySQLのDECIMAL型も同様に「CHAR項目のように振舞います」
とマニュアルにあります。その意味ではOracleのNUMBER型にそのまんま対応するの
はDECIMAL型だといっていいかもしれません。NUMERIC型というのもあるんですが…
…。確かOracleでもDECIMAL型が使えたように思います。標準SQL(SQL92でしたっけ
?)で定義されているんですよね、たぶん、DECIMAL型。
私がOracleで扱っているのは事務処理システムなんで、浮動小数点だっ!!というよ
うなものはなくって、小数が出てくるのは消費税計算とか平均とかを出すときくら
いです。で、かつてInformixではINTEGER型を使っていたんですが、Oracleに移行し
たときにどこかでNUMBER型が推奨されていたんでそのまんまNUMBER型にしちゃいま
した。なんで推奨されていたんだろうかなぁ、すでに忘れています。
まぁMySQLでいきなり大事な仕事をはじめることはないとは思うんですが、念の為に
、数値の扱いはやっぱりDBエンジンごとに違っていたりするんで要注意だと思いま
す。
試しに0.999×0.999をやってみます。

Oracleだと(開発環境なんでちょっと古い)

=============================================
Oracle8 Release 8.0.3.0.0 - Production
With the Partitioning and Objects options
PL/SQL Release 8.0.3.0.0 - Production
に接続されました。
SQL> select 0.999 * 0.999 from dual;

0.999*0.999
-----------
    .998001

SQL> create table test(wao decimal(3,3));

表が作成されました。

SQL> insert into test values(0.999);

1行が作成されました。

SQL> select wao * wao from test;

   WAO*WAO
----------
   .998001

SQL> 
=============================================

となります。で、MySQLだと

=============================================
mysql> select 0.999 * 0.999;
+---------------+
| 0.999 * 0.999 |
+---------------+
|         0.998 |
+---------------+
1 row in set (0.00 sec)

mysql> create table test(wao decimal(3,3));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test values(0.999);
Query OK, 1 row affected (0.00 sec)

mysql> select wao * wao from test;
+-----------+
| wao * wao |
+-----------+
|     0.998 |
+-----------+
1 row in set (0.00 sec)

mysql>
=============================================

となります。

#!/usr/bin/perl
use Mysql;
$dbh = Mysql->connect("localhost", "shop_db", "shop", "shop");
$sql = "select wao * wao from test";
$sth = $dbh->query($sql);
$wao = $sth->fetchhash;
print "[$wao]\n";

というのを作っても
[0.998]
というのが返ってきます。まぁこれは型の問題というよりは型から取り出したあと
の処理の問題でしょう。元のシステムがOracleどっぷりだったりすると結構とまど
うかも。
 ちなみに私は最初「select 0.999 * 0.999」が「from dual」なしで動くってのに
とてつもなく違和感がありました。慣れました。

OracleからMySQLへの移行ですが、7.3とかでちょっと規模が大きいシステムだと
CREATE TABLE文の最後にSTORAGE(INITIAL 5000K NEXT 1000K)とかPCTFREEだとか書
いてあるでしょうから、そのままポンとはいかないかもしれませんね。
あと、私の使っているMySQLは3.21.33bなんで、「ふつー」の方達が使われている新
しい3.22系とは違うかもしれません。よくわかりません。

[前][次][番号順一覧][スレッド一覧]

->     435 1998-12-09 20:57 [Satoshi Koiwa <koiwa] Re:  CREATE TABLE 句についての質問      
       436 1998-12-09 22:04 ┣[Tamon Nomura <tamon@]                                       
       438 1998-12-10 09:29 ┗[民斗 <tommy@xxxxxxxx]