2004/05/13 3-4 データ型(カラムタイプ) について 発表者:藤村元彦 自然言語処理研究室 指定のデータ型と違うデータを入力した場合 データ型が文字列型のカラムに数値データを入 れることは可能だが、計算や検索がうまく行われ ない。また、数値型のカラムに文字列を入れよう とすると、自動的にゼロが代入される。 次の例は、4つ目のレコードの数値型カラム AGE_Cに文字列を代入した場合である。 型の違うデータの入力例 mysql> insert into FRIENDS_T set ID_C = 4, AGE_C = "大阪"; Query OK, 1 row affected (0.00 sec) mysql> select * from FRIENDS_T; +------+----------+---------------------------+-------+ | ID_C | NAME_C | ADD_C | AGE_C | +------+----------+---------------------------+-------+ | 1 | 大友達子 | 東京都千代田区何処町1-1-1 | 23 | | 2 | 小友達夫 | 東京都葛飾区何処町1-1-1 | 45 | | 3 | 友田知香 | 青森県青森市何処町2-2-2 | 17 | | 4 | NULL | NULL | 0 | +------+----------+---------------------------+-------+ 4 rows in set (0.00 sec) データ型の自動変更 MySQLでは、指定されたデータの種類によってカ ラムの型が自動的に変化することがある。例え ば、4文字以上のchar型はvarchar型に、3文字 以下のvarchar型はchar型に変更される。 また、timestamp型では、2から14までの偶数を サイズとして指定するが、0や14を超える値の場 合は自動的に14になる。奇数の場合は、一つ大 きな値がサイズとなる。 enumとsetの使い方 enum型、set型は、型の定義時にリストで指定したデータ 以外は入力できない。以下の例では、カラムに入力可能 なデータのリストをenum型で定義し、そこにリストにない データや、リストにある2つ以上データを入力しようとした 場合で、その場合はエラーとなる。 mysql> create table TEST_ENUM(ORDER_NO int,PC_GOODS -> enum(“モニタカバー”,“マウスパッド”,“FDケース”, -> “スピーカ”)); Query OK, 0 rows affected (0.03 sec) enumとsetの使い方の続き mysql> insert into TEST_ENUM(ORDER_NO,PC_GOODS) -> values(1,‘マウスパッド’),(2,‘スピーカ’ ), -> (3,‘FDケース’),(4,‘スピーカ,マウスパッド,スピーカ’ ), -> (5,'ケーブル' ; Query OK, 5 rows affected (0.00 sec) Records: 5 Duplicates: 0 Warnings: 2 mysql> select * from TEST_ENUM; +----------+--------------+ | ORDER_NO | PC_GOODS | +----------+--------------+ | 1 | マウスパッド | | 2 | スピーカ | | 3 | FDケース | | 4 | | | 5 | | +----------+--------------+ 5 rows in set (0.00 sec) 日付型データ 日付型データは、文字列型や数値型についでよ く使われるデータ型である。日付型のデータは、 yyyy-mm-ddの型(4桁の西暦年、2桁の月と日) で格納され、次のように、カラムのデータ型として 「date」と指定する。 mysql> create table -> DATE_T(ID int auto_increment not null -> primary key,BIRTHDAY date); Query OK, 0 rows affected (0.01 sec) 日付型データの入力例 mysql> insert into DATE_T set BIRTHDAY = "1999-01-01"; Query OK, 1 row affected (0.01 sec) mysql> insert into DATE_T set BIRTHDAY = "19800125"; Query OK, 1 row affected (0.00 sec) mysql> insert into DATE_T set BIRTHDAY = "2000/02/06"; Query OK, 1 row affected (0.00 sec) mysql> select * from DATE_T; +----+------------+ | ID | BIRTHDAY | +----+------------+ | 1 | 1999-01-01 | | 2 | 1980-01-25 | | 3 | 2000-02-06 | +----+------------+ 3 rows in set (0.00 sec) 日付型データの入力方法 以上のように日付型データは、「/」で区切ったり、 区切りがなくても入力可能である。 また、西暦を2桁で入力すると、4桁に変換されて 登録される。MySQL3.22以降のバージョンでは 1901~2155までの数値が年として自動判断され るので、意図しない変換を避けるためにも、西暦 は4桁で入力するべきである。 不正な日付型データ なお、米国などで使われているmm-dd-yyyy型には対応 しておらず、入力しても0000-00-00となる。 mysql> insert into DATE_T set BIRTHDAY = "06/25/1980"; Query OK, 1 row affected (0.00 sec) mysql> select * from DATE_T; +----+------------+ | ID | BIRTHDAY | +----+------------+ | 1 | 1999-01-01 | | 2 | 1980-01-25 | | 3 | 2000-02-06 | | 4 | 0000-00-00 | +----+------------+ 4 rows in set (0.00 sec) 日付関数による日付の操作 date_format()関数を使うと、既定の形式以外でも 表示することなら可能である。 mysql> select date_format(BIRTHDAY,"%m %d,%y") from DATE_T; +----------------------------------+ | date_format(BIRTHDAY,"%m %d,%y") | +----------------------------------+ | 01 01,99 | | 01 25,80 | | 02 06,00 | +----------------------------------+ 3 rows in set (0.00 sec) date_format()の西暦4桁表示 西暦を4桁表示にするには、%yを%Yと大文字にす る。 mysql> select date_format(BIRTHDAY,"%m %d,%Y") from DATE_T; +----------------------------------+ | date_format(BIRTHDAY,"%m %d,%Y") | +----------------------------------+ | 01 01,1999 | | 01 25,1980 | | 02 06,2000 | +----------------------------------+ 3 rows in set (0.00 sec) 現在の日付と時間 現在の日付を知るにはcurdate関数、現在の時 刻を知るにはcurtime関数を使う。 現在日時: mysql> select curdate(); 現在時刻: mysql> select curtime(); 年のみを表示する関数:year() 誕生日と現在日時から歳を調べるには、日付か ら年のみを取り出すyear()関数を使って計算する。 mysql> select year(curdate()) - year(BIRTHDAY), -> BIRTHDAY from DATE_T; +----------------------------------+------------+ | year(curdate()) - year(BIRTHDAY) | BIRTHDAY | +----------------------------------+------------+ | 5 | 1999-01-01 | | 24 | 1980-01-25 | | 4 | 2000-02-06 | +----------------------------------+------------+ 3 rows in set (0.02 sec) 期間を定義:date_add() 以下の例は、REGISTRATIONという登録日カラムを持つ テーブルから、1年半有効のカードなどが無効になる日を 計算したものである。 mysql> select REGISTRATION, -> date_add(REGISTRATION,interval 18 month) as -> “失効日” from DATE_T; +--------------+------------+ | REGISTRATION | 失効日 | +--------------+------------+ | 1999-01-01 | 2000-07-01 | | 1980-01-25 | 1981-07-25 | | 2000-02-06 | 2001-08-06 | +--------------+------------+ 3 rows in set (0.00 sec)
© Copyright 2025 ExpyDoc