SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

EnterpriseZine(エンタープライズジン)編集部では、情報システム担当、セキュリティ担当の方々向けに、EnterpriseZine Day、Security Online Day、DataTechという、3つのイベントを開催しております。それぞれ編集部独自の切り口で、業界トレンドや最新事例を網羅。最新の動向を知ることができる場として、好評を得ています。

直近開催のイベントはこちら!

Security Online Day 2022

2022年9月16日(金)10:00~17:10

EnterpriseZine(エンタープライズジン)編集部では、情報システム担当、セキュリティ担当の方々向けの講座「EnterpriseZine Academy」や、すべてのITパーソンに向けた「新エバンジェリスト養成講座」などの講座を企画しています。EnterpriseZine編集部ならではの切り口・企画・講師セレクトで、明日を担うIT人材の育成をミッションに展開しております。

お申し込み受付中!

MySQL事始

MySQL事始 データ型

第7回


数値型

整数や小数などの数値を格納するデータ型です。格納可能な値の範囲およびデータサイズなどは下記URLを参照してください。
10.2. 数値タイプ

型名 データ型 桁数指定 オプション
BIT ビット 桁数 なし
TINYINT 整数 桁数 UNSIGNED, ZEROFILL
SMALLINT 整数 桁数 UNSIGNED, ZEROFILL
MEDIUMINT 整数 桁数 UNSIGNED, ZEROFILL
INT 整数 桁数 UNSIGNED, ZEROFILL
INTEGER 整数 桁数 UNSIGNED, ZEROFILL
BIGINT 整数 桁数 UNSIGNED, ZEROFILL
REAL 浮動小数 点数 UNSIGNED, ZEROFILL
DOUBLE 浮動小数 点数 UNSIGNED, ZEROFILL
FLOAT 浮動小数 点数 UNSIGNED, ZEROFILL
DECIMAL 固定小数 点数 UNSIGNED, ZEROFILL
NUMERIC 固定小数 点数 UNSIGNED, ZEROFILL

オプションのUNSIGNEDは、0と正の数だけを格納可能とし、格納可能な正の数の範囲もほぼ倍となります。TINYINTの場合、UNSIGNED無しだと格納可能なのは-127から128ですが、UNSIGNEDを使用すると0から255が格納可能範囲となります。

なお、MySQL独特の挙動として、格納可能範囲外の値が挿入された場合は自動的に値を「丸め」ます。例えばUNSIGNED無しのTINYINTが指定された列に、格納可能範囲外の128を挿入すると127に変更され、-129を挿入すると-128に変更されて格納されます。なお、値が自動的に変更された場合にはWarningが出力されます。¥Wを実行してWarningが自動的に表示される状態でテストした例です。1行目の値-129および7行目の値128が「Out of range value(格納可能範囲外の値)」となっており、自動的にそれぞれ-128と127に変更されて格納されています。


mysql> ¥W
Show warnings enabled.

mysql> CREATE TABLE r1(c1 TINYINT);
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO r1 VALUES(-129), (-128), (-127), (0), (126), (127), (128);
Query OK, 7 rows affected, 2 warnings (0.00 sec)
Records: 7  Duplicates: 0  Warnings: 2

Warning (Code 1264): Out of range value for column 'c1' at row 1
Warning (Code 1264): Out of range value for column 'c1' at row 7


mysql> SELECT * FROM r1;
+------+
| c1   |
+------+
| -128 |
| -128 |
| -127 |
|    0 |
|  126 |
|  127 |
|  127 |
+------+
7 rows in set (0.00 sec)

プログラミング言語や他のデータデータベースでも共通するポイントですが、浮動小数点の丸め誤差の問題はMySQLでも注意が必要です。

精度を求められる数値演算には固定小数点型であるDECIMALNUMERICを利用します。下記の例では2進数では循環小数でしか表現できない値-0.1を格納した場合に、浮動小数点型では誤差のある値が格納されており、それぞれの列の値が異なっていることを確認している例です。


mysql> CREATE TABLE r2(c1 FLOAT(60,10), c2 DECIMAL(60,10));
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO r2 VALUES(-0.1, -0.1);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT c1*10000000000, c2*10000000000 FROM r2;
+------------------------+------------------------+
| c1*10000000000         | c2*10000000000         |
+------------------------+------------------------+
| -1000000014.9011612000 | -1000000000.0000000000 |
+------------------------+------------------------+
1 row in set (0.00 sec)

mysql> SELECT IF(c1 = c2,'TRUE','FALSE') FROM r2;
+----------------------------+
| IF(c1 = c2,'TRUE','FALSE') |
+----------------------------+
| FALSE                      |
+----------------------------+
1 rows in set (0.00 sec)

次のページ
日時型

この記事は参考になりましたか?

  • Facebook
  • Twitter
  • Pocket
  • note
MySQL事始連載記事一覧

もっと読む

この記事の著者

梶山隆輔(カジヤマリュウスケ)

日本オラクル MySQL Global Business Unit Asia Pacific & Japan担当 MySQLソリューション・エンジニアリング・ディレクターオラクル社において、MySQLのお客様環境への導入支援や製品の技術解説を担当するセールスコンサルタントチームのアジア太平洋地域リー...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

EnterpriseZine(エンタープライズジン)
https://enterprisezine.jp/article/detail/3457 2012/02/10 17:56

Job Board

PR

おすすめ

アクセスランキング

アクセスランキング

イベント

EnterpriseZine(エンタープライズジン)編集部では、情報システム担当、セキュリティ担当の方々向けに、EnterpriseZine Day、Security Online Day、DataTechという、3つのイベントを開催しております。それぞれ編集部独自の切り口で、業界トレンドや最新事例を網羅。最新の動向を知ることができる場として、好評を得ています。

2022年9月16日(金)10:00~17:10

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング