SQL プログラミング

【豆知識】カラムのデータ型はどんなのがあるの?データ型は気にせず使っていいの?

スポンサーリンク

SQLXec03

頼れる人
テーブルのカラムには、全角文字や半角文字・数字・記号などをセットすることができます
それぞれのデータの種類にあったデータ型を使うと便利です
データ型の違いや使い方を教えるよ

もうすでに、データ型についてどういったものかは知ってるよ!という人は、ここは読まなくていいですよ
こけさん

データ型とはなに?

 テーブルのカラムには、名前を入れたり、金額を入れたり、誕生日を入れたりと、様々な用途で利用します。

 それぞれの用途に応じたデータ型の中で値を管理することで、データ型に適したデータの編集や計算などが大変やりやすくなっています。
 データベースの種類によって、同じ文字列型・数値型でもデータ型の名称が異なりますので、利用するデータ型に合わせて使うようにしましょう。ここでは一般的なデータ型の説明をします。

文字列型

 名前や住所、コードなどの文字列を入れるには、文字列型と呼ばれるデータ型が適しています。
 文字列型には、CHAR・VARCHARがあります。他にもTEXTなどがあります。
 指定した長さ以下であれば、全角文字でも半角文字でもセットすることができます。
 全角文字の場合は1文字につき半角文字の2倍の長さが必要となります。

データ型説明
CHAR固定長文字列指定された長さの文字列をセットできます
20バイトの長さのカラムに「ABC123」を入れると、足りない長さの分は後ろに空白で埋められます
VARCHAR可変長文字列指定された長さ以下の文字列をセットできます
20バイトの長さのカラムに「ABC123」を入れると、6バイト分のみがセットされ、後ろが空白で埋められることはありません

数値型

 金額や数量などの数字を入れるには、数値型と呼ばれるデータ型が適しています。
 数値型には、NUMBER・INTEGER・DECIMALがあります。他にもDOUBLEやFLOAT・NUMERICなどがあります。
 型の種類によって、入れられる数値の範囲が決まっています。また、整数だけしか入れられないデータ型もあれば、小数点まで入れることができるデータ型もあります。

データ型説明
NUMBER固定または浮動小数点数指定された長さの数値をセットできます
整数のみでも小数点を含んだ数値、そしてマイナスの数値もセットすることができます
INTEGER整数指定された長さの数値をセットできます
整数のみでマイナスの数値もセットすることができます
DECIMAL固定または浮動小数点数指定された長さの数値をセットできます
整数のみでも小数点を含んだ数値、そしてマイナスの数値もセットすることができます

日付型

 誕生日や登録した日時を入れるには、日付型と呼ばれるデータ型が適しています。
 日付型には、DATE・TIMESTAMPがあります。他にもDATETIMEなどがあります。

データ型説明
DATE日付または日時日付や日付と時分秒までをセットできます
TIMESTAMP日時日付や日付と時分秒までをセットできますが、ミリ秒・マイクロ秒までセットされます

バイナリー型

 先に挙げた文字型や数値型や想像しやすいと思いますが、バイナリー型というのは少しイメージしにくいかと思います。
 コンピューターで扱うデータそのものをバイナリーデータといいます。
 文字コードが異なるデータや画像ファイルそのものをカラムに入れたいときに、このバイナリー型を利用します。
 バイナリー型には、RAWやBINARYがあります。他にもLOBなどがあります。

データ型説明
RAW可変長バイナリー指定された長さのバイナリーデータをセットできます
BINARY可変長バイナリー指定された長さのバイナリーデータをセットできます

何も気にせず使ってもいいの?

 数値を扱うカラムでも文字列型で定義して、そこに値をセットして使っても問題ありません。
 日付を扱うカラムでも文字列型や数値型で定義して、使っても問題はありません。
 ただし、英字や日本語を数値型や日付型のカラムに使うことはできません。

 では、すべて文字列型で利用すればいいのでは?と思ってしまいますが、データの種類に適したデータ型で利用することで大変便利になっています。

 例えば、2021年1月10日を文字列型に入れたときと、日付型に入れたときの違いを見てみましょう。
 文字列型では、「20210110」と文字として入っています。
 日付型では、1900年1月1日 0時0分0秒からどれくらい経過したかを示すシリアル値が入っています。

 日付型のカラムでは、2か月前の日付を取得したいとか、10時間後の日時を取得したいとか、日付や時刻での計算ができます。
 しかし、文字列型のカラムでは、こうした日付や時刻での計算を行うことができないのです。

 文字列型のカラムでは、先頭から5文字分を抜き出したいとか、指定した文字が含まれているかなどを調べることができます。
 それぞれのデータの種類に適したデータ型を利用することが望ましいです。

違うデータ型に変換して使うにはどうしたらいいの?

 文字列型のカラムに数字が入っていたとき、100より大きいときのみデータを取得したいときなど
 WHERE [ 文字列型のカラム名 ] > 100 というSQLを書いてもデータは取得できます。

 これはデータベースが右辺と左辺のデータ型が異なっているとき、暗黙の型変換を行ってくれるからなのです。
 でも、いくらこの暗黙の型変換を行ってくれるかといっても、これを行うことでSQLの実行速度に影響してきます。
 またその型変換がされてしまうことで、意図していない結果となってしまうときもあります。
 なので、WHERE句で条件を指定するときには、右辺と左辺のデータ型をきちんと合わせるようにしましょう。

 値を別のデータ型に変換するには、変換用の関数を利用します。
 この関数はSELECT句やWHERE句でも使えますし、GROUP BY句やHAVNG句でも使えます。

 ■ 数値や日付を文字列型にするには、TO_CHARという関数を使います。
 ※データベースによっては、CONVERT関数などを使います。

// 数値を文字列型へ
SELECT TO_CHAR(12, ‘0000’) AS NUM
FROM DUAL;

NUM
----------------
0012
// 日付を文字列型へ
SELECT TO_CHAR(SYSDATE, ‘YYYY-MM-DD HH24:MI:SS’) AS NOWDATE
FROM DUAL;

NOWDATE
----------------
2021-02-11 18:02:47

 ■ 文字列を数値型にするには、TO_NUMBERという関数を使います。
 ※データベースによっては、CONVERT関数などを使います。

// 文字を数値型へ
SELECT TO_NUMBER(‘456’) AS NUM
FROM DUAL;

NUM
----------------
             456

 ■ 文字列を日付型にするには、TO_DATEという関数を使います。

// 日付型に変換して、足し算すると正しい日付に
SELECT TO_DATE(‘20210210’, ‘YYYYMMDD’) + 30 AS NOWDATE
FROM DUAL;

NOWDATE
----------------
2021-03-11 00:00:00

// 日付型に変換せずに、足し算すると・・・
SELECT 20210210 + 30 AS NOWDATE
FROM DUAL;

NOWDATE
----------------
20210240

WHERE句で型変換を行うときには、検索するカラムがキーになっているときにそのカラムに型変換を使うことでインデックスが効かなくなってしまいます
そのときには、キーとなっているカラムのデータ型に合わせるように、もう一方の値を型変換しましょう

// インデックスが効果あるとき
SELECT  id, name
FROM players
WHERE TO_CHAR(birthday,’YYYYMMDD’) >= ‘20051101’;

// インデックスが効果ないとき
SELECT  id, name
FROM players
WHERE birthday >= TO_DATE(‘20051101’,’YYYYMMDD’);

まとめ

 カラムにはデータ種類に合ったデータ型を利用します。
 別のデータ型に変換するときには、それぞれに合った関数が用意されていますので、それを使って正しく型変換を行うようにしましょう。
 場合によっては、データベースが暗黙の型変換を行ってくれますが、意図しない結果を返してきたり、SQLの実行速度にも影響することがありますので、このカラムはどのデータ型で扱うべきかをきちんと意識して、必要に応じて型変換を行うようにしましょう。

▶ 一覧に戻る

    スポンサーリンク

    -SQL, プログラミング
    -

    PAGE TOP

    © 2021 ちょこぱいぶろぐ Powered by AFFINGER5