データベースのテーブル作成(型)

※以前別の場所で書いた文章を備忘的に書き記しておきます。

【投稿年月日】2007-01-15 【ジャンル】PHP/MySQL


 データベースのテーブル作成にあたり、まず各フィールドの型を決定する必
要があります。私は以下のように分類して把握しています。
  1. 【数値型】整数 (tinyint、int等)
  2. 【数値型】浮動小数点 (float、decimal等)
  3. 【日付と時刻型】(datetime、date等)
  4. 【文字列型】A(char、varchar)
  5. 【文字列型】B(text、largetext等)
  6. 【文字列型】C(enum、set)

カラム型
dev.mysql.com/doc/mysql/ja/column-types.html


1【数値型】整数


 一般的に整数の数値データを扱う場合は「int」を使いますが、データの大
きさによって使い分けることを考えた方がいいかもしれません。「int」は10
桁前後の数字を扱えるので、たいていはこれで足りると思います。さらに大き
な数字を扱う場合は「bigint」という型も用意されています。

 なお「int(11)」のようにスクリプトを記述しますが、()内の数字は実際に
表示される最大の桁数を意味します。また[]内はオプションに「UNSIGNED」を
つけた場合の範囲となります。

「tinyint(4)」 1バイト
※範囲:-128~127 [0~255] ※Yes/No等の判断に適している

「smallint(6)」 2バイト
※範囲:-32,768~32,767 [0~65,535]

「mediumint(8)」 3バイト
※範囲:-8,388,608~8,388,607 [0~16,777,215]

「int(11)」 4バイト
※範囲:-2,147,483,648~2,147,483,647 [0~4,294,967,295]

数値型
dev.mysql.com/doc/mysql/ja/numeric-types.html


2【数値型】浮動小数点


 一般的に小数点が必要となる場合には「float」を使います。あまり把握し
ていないのでうまく解説することができませんが、この型を使うと正確な値と
してデータが格納されないようです。厳密さを求める場合は文字列として格納
する「decimal」を使う方がいいようです。

「float(精度, 小数点以下の桁数)」 4バイト
※範囲:-3.402823466E+38~-1.175494351E-38、
    0、1.175494351E-38~3.402823466E+38

「decimal(精度, 小数点以下の桁数)」 パック無し浮動小数
※範囲:-1.7976931348623157E+308~-2.2250738585072014E-308、
    0、2.2250738585072014E-308~1.7976931348623157E+308

浮動小数点比較の問題
dev.mysql.com/doc/mysql/ja/problems-with-float....


3【日付と時刻型】


 一般的に日付や時刻を格納する場合には「datetime」を使います。

「year(4)」 1バイト
※年 year(4)…'0000' ('YYYY')、year(2)…'00' ('YY')

「date」 3バイト
※日付 '0000-00-00' ('YYYY-MM-DD')

「time」 3バイト
※時間 '00:00:00' ('HH:MM:SS')

「timestamp(14)」 4バイト
※日付時間 timestamp(14)…'00000000000000' ('YYYYMMDDHHMMSS')

「datetime」 8バイト
※日付時間 '0000-00-00 00:00:00' ('YYYY-MM-DD HH:MM:SS')

日付と時刻型
dev.mysql.com/doc/mysql/ja/date-and-time-types....


【文字列型】A


 一般的に文字数が決まっている場合(1~255バイト)には「varchar」を使
います。例えば60バイトならば「varchar(60)」となります。類似するものと
して「char」があります。

「char(文字数)」 文字数は1~255バイトで指定(固定長)

「varchar(文字数)」 文字数は1~255バイトで指定(可変長)

CHAR型とVARCHAR 型
dev.mysql.com/doc/mysql/ja/char.html


【文字列型】B


 一般的に文字数が決まっていない場合には「text」を使います。もっと大き
なデータを扱いたい場合は「mediumtext」「largetext」が用意されています。
類似するものとして「blob」があります。

「tinytext」 1~255バイト

「text」 1~65,535バイト

「mediumtext」 1~1,677,215バイト

「largetext」 1~4,294,967,295バイト

BLOB型とTEXT型
dev.mysql.com/doc/mysql/ja/blob.html


【文字列型】C


 リスト形式でデータを扱いたい場合は「enum」や「set」を使います。文字
列を値とする配列と考えればいいようです。馴染みのない型ですが、使い方に
よってはとても便利なようです。
 例えば、曜日をリスト出力するには次のように記述します。
//テーブル作成 (※テーブル名…youbi)
//(※フィールド名…[youbi1],[youbi2])
mysql_query("CREATE TABLE IF NOT EXISTS youbi (
 youbi1 enum('月', '火', '水', '木', '金', '土', '日'),
 youbi2 set('月', '火', '水', '木', '金', '土', '日')
)");

//データ作成(※テーブル名…youbi)
mysql_query('INSERT INTO youbi values(1, 1)');
mysql_query('INSERT INTO youbi values(3, 2)');
mysql_query('INSERT INTO youbi values(6, 3)');
mysql_query('INSERT INTO youbi values(9, 4)');
mysql_query('INSERT INTO youbi values(4, 5)');


 phpMyAdminで「youbi」テーブルを確認すると以下のようなデータが作成さ
れているはずです。
[youbi1]
[youbi2]





月,火
 


月,水

 すなわち「enum」は以下のように変換されて格納。
[入力データ]
[格納データ]
1

3

6

9
(※該当するものなし)
4



 すなわち「set」は以下のように変換されて格納。
[入力データ]
[格納データ]
1

2

3
月,火
4

5
月,水


 「enum」は順番通りに変換されているので分かりやすいですが、「set」は
分かりづらいと思われます。より詳しくは下記ページをご覧ください。

「enum('value1','value2',...)」
※最大65,535個の要素。
dev.mysql.com/doc/mysql/ja/enum.html

「set('value1','value2',...)」
※最大64個の要素。
dev.mysql.com/doc/mysql/ja/set.html


 その他、参考にしたページは以下の通りです。

各カラム型に必要な記憶容量
dev.mysql.com/doc/mysql/ja/storage-requirements...
データ型の概要
www.rfs.jp/sitebuilder/sql/02/03.html
全データ型の一覧
www.rfs.jp/sitebuilder/sql/02/02_table.html

EDIUNET | PHP/MySQL | 独り言 | 提供サービス | JavaScript