データ型はおおまかに分類すると次の6種類
POINT
QueryBrowser で文字をうつと, 補間される( STRING といれようとすると, そんな型はないので補間されない )
■ BOOL
DESC
条件が真であるかどうかを表す値のこと
2 つある
■ DATETIME.DATE
DESC
日付, 時刻を保存しておく型
DATETIME 日付と時刻
DATE 日付
TIME 時刻
TIMESTAMP タイムスタンプ
YEAR 年
値を指定する時の文字列の書式は以下のような指定ができる
もし書式が不正と判断すると0値が設定される
YYYY-MM-DD HH:MM:SS
YYYY.MM.DD HH.MM.SS
YYYY/MM/DD HH/MM/SS
YYYYMMDDHHMMSS
// 形式 'YYYY-MM-DD HH:MM:SS'
insert into tbl (birthday) values('2010.05.28 10:22:22')
// 時間を省略
// RET: "2010-05-05 00:00:00"
insert into tbl (birthday) values('2010.05.05')
-- 誕生日が 2010年5月30日 より後を指定
select * from tbl where birthday > "2000-05-30";
WARNING
-- Strict Mode では 不正な日付はエラー
insert into tbl (d) values('2010.04.31')
WARNING
["] いります
■ 整数
DESC
次の 5 つがある
各格納できる値の範囲が決まっていて
範囲を超えるとエラーになる
TINYINT
-128:127 (unsigned 0:255 )
SMALLINT
-32768:32767 (unsigned 0:65535)
MEDIUMINT
-8388608:8388607 (unsigned 0:16777215 )
INT(INTEGER)
-2147483648:2147483647 (unsigned 0:4294967295)
BIGINT
-9223372036854775808から9223372036854775807
(unsigned 0:18446744073709551615)
■ ZEROFILL
DESC
SQL Browser にもある。
■ 表示幅
SYNTAX
typename( N )
DESC
各データ型は表示幅を設定できます
Nには幅を表す数値
幅を指定すると指定した幅で数値が表示されます
本来使用可能な桁数よりも小さい表示幅を指定すると
表示幅よりも大きい値を指定すると設定は無視される
SMALLINT(3)
■ UNSIGNED
DESC
数値型に 符号なし OPTION を追加する
WARNING
// すでに マイナスがはいってる column に UNSIGNED
// を追加すると怒られる
//
Out of range value for column 'nr' at row 1
■ 文字列型(string)
DESC
文字列を格納します
型によって最大 Byte 数がきまっています
WARNING
() 内の数値は 半角のときの 最大文字数( 2 Byte 文字は半分にへる )
まとめると 3 つ
// 型名 最大 Byte
CHAR 255 固定長 半角英数字は255文字まで、2バイト文字は約127文字まで
VARCHAR 255 可変長 半角英数字は255文字まで、2バイト文字は約127文字まで
TEXT 65535 大量の文字列を保存したいときに利用
WARNING
// 2 べきの値はだめです
-- BAD
CHAR(256)
-- OK
CHAR(255)
■ CHAR(文字数)
DESC
指定文字数(バイト数)分の文字列が保存できる「固定長」のデータ型
固定長 とは文字列を保存するときに必ず確保した文字数(バイト数)を消費する
// 10 byte 分の箱を用意
char(10)
insert into tbl moji
// 空白 で padding される
// とりだすときは, space が削除される
--------------------
abcde[ ][ ][ ][ ][ ]
--------------------
CHAR(10) [xxxxxxxxx___]
CHAR(7) は超えることができない
CHAR 型のカラムでは、
CHAR(4) 型と VARCHAR(4) 型から取り出した値はそれぞれの場合で変わりません
まとめるとコレ
CHAR , VCHAR の比較 ( 単位 : byte )
値 CHAR(4) WORKSIZE VARCHAR(4) WORKSIZE
'' ' ' 4 '' 1
'ab' 'ab ' 4 'ab' 3
'abcd' 'abcd' 4 'abcd' 5
'abcdefgh' 'abcd' 4 'abcd' 5
WARNING
// 最大文字数をこえるとエラー
// ERROR 1406 (22001) at line 5: Data too long for column 'str' at row 1
insert into test.testtbl (str) values("testdayo");
■ VARCHAR(最大文字数)
DESC
上限つきの Variable (可変サイズ)のCHAR型
保存された文字数分の領域しか消費しません
可変 Work だから遅い
最大文字に満たないときは 文字数 + 1 byte 分を消費する
VARCHAR(10) // 最大10文字の可変長文字列
// 4 byte 消費
--------
[abc][N]
--------
// 8 byte 消費
-------------
[abcdefgh][N]
-------------
WARNING
文字数 というのは半角文字で書かれた場合の文字数ということ
日本語は2バイト文字を保存するとき半分の5文字になる。
想定文字数の 2 倍程度にする。
■ TEXT
DESC
65535 バイトの文字列が保存可能なデータ型
保存される文字列数が特定できないカラムに対して利用する。
WARNING
デフォルト値は指定できない。
( BLOB/TEXT column cant have a default value )
改行Code は [\r\n] かも?
可変長文字列
TINYTEXT : 2^ 8-1 バイト
TINYTEXT : 2^16-1 バイト
MEDIUMINTTEXT : 2^24-1 バイト
LONGTEXT : 2^32-1 バイト
// SQL 文では CHAR と同じようにすればいいだけ
insert into foo (txt) values("aaa")
■ BLOB(BinaryLargeObject)
DESC
データをバイトコードとして格納する。
違いはソートと比較時に大文字と小文字を区別するかしないか
(BLOBはする, TEXTはしない)
■ Enum(列挙型)
DESC
あらかじめ決めた値のリストを定義する型
設定できる数は 2^16 個
設定される値があらかじめ決まっているならば利用すると便利。
( 性別カラムの男 | 女 )
Enum 型の値は 1 から始まり
0 は空文字列が返る。
-- 条件の指定では文字列ではなく数値でする
select name from member where sex = 1;
■ set
DESC
Enum型同様にあらかじめ値のセットを決めておくが
セットの中から自由に組み合わせることができる。
C でのビットフラグのような扱い。
最大で64個の要素を持てる。
-- 条件指定には & をつかう
select name from member where family & 4;
■ Set
■ Column.属性
DESC
各 column には 属性を指定できます
TIP
いろんな "おせっかい" があるので STRICT mode にするとよいかも
こんなおせっかいがある
my.cnf に STRICTモードにできます 以下のようにsql-modeを追記
[mysqld]
sql-mode="STRICT_ALL_TABLES"
■ NotNULL
DESC
この Colunn は not null == [ NULL はなしよ ] という意味
// もし指定しないと, 次のようにいわれる ( "test" Column は null になりえない )
// Column 'test' cannot be null
insert into tbl (test, str) values( null, null )
TIP
すでに null がある column を NotNULL に変更するとERROR がでます
// 次はいれることができる -> 0 が "0" と解釈してくれる
insert into foo (test, str) values(0, 0)
BAD
insert into tbl (test, str) values(0, 0aaa)
OK
insert into tbl (test, str) values(0, "0aaa")
-> ちなみに table 一覧を見ると, ["] はつかない. -> これは 文字列ですよ ! という意味
// [ Default Value ] が空のときは 怒られる
insert into foo (test) values(0)
Field 'str' doesn't have a default value
■ DefaultValue
DESC
デフォルト値を指定する
insert でカラムの指定がないときは, この値がセットされる。
QueryBrowser ではカラム型によって次のように入力する
// BAD
文字列型 abc
// 文字列はクォートすること
文字列型 "abc"
文字列型 'abc'
// 数値型はそのまま入力
数値型 1
// NULL を指定するとカラムの値の指定がなければ NULL がセットされる。
// ただし オプションとして NotNULL をオフにする必要がある。
WARNING
NotNULL を指定すると インサート時のカラムの指定がなければDefault値が設定される。
そのとき値の指定がなければエラーになる。
TEXT, BLOB はデフォルト値をもつことができない為 NotNULL オフではエラーになる。
NotNULL オンではNULLが設定される。
Field 'xxx' doesn't have a default value
// 空文字が default
// char(10) のときは, "def" と入力しないと ERROR になる
insert 時に 指定しなくてもよい方法は 2 つある
TIP
Column を追加するときに, Default なし && NotNULL にすると
その型の Default がはいるらしいです
// Int なら 0 がはいる
int -> [0]
TIP
// null の扱いはおいておき, Defalut Value を空にすると,
// == Default 値は ないとみなされて, 怒られる
// ちなみに , field をつくった直後は NOT NULL が ON になるらしい
-> ie. 空はなしよ ! ということになる. -> 慣れないうちはこれが望ましい
// Default Value [null] とあったら 文字とおり, 空 == 指定がないということ