共有

はじめに

リレーショナルデータベースの主要な特徴の1つは、格納するデータの形式を正確に指定するスキーマテーブル構造を定義できることです。これは、これらの構造に含まれる列と、それらのデータ型および制約を規定することによって行われます。

データ型は、受け入れて格納するデータの一般的なパターンを指定します。値は、MySQL に受け入れられるために、データ型が規定する要件に準拠する必要があります。カスタム要件を定義することも可能ですが、データ型は、MySQL が入力を検証し、適切な操作を使用してデータを扱うための基本的な構成要素を提供します。

MySQL には、値が適切な型に準拠していることを示すラベル付けと検証に使用される幅広いデータ型が含まれています。このガイドでは、MySQL で利用できる最も一般的なデータ型、それらが使用するさまざまな入出力形式、およびアプリケーションのニーズに合わせてさまざまなフィールドを構成する方法について説明します。

MySQL のデータ型とは?

詳細に入る前に、MySQL が提供するデータ型について概観しましょう。

MySQL は、さまざまな種類の単純データおよび複雑データに適した、合理的な範囲のデータ型をサポートしています。これには以下が含まれます。

  • TINYINT
  • SMALLINT
  • MEDIUMINT
  • INT
  • BIGINT
  • DECIMAL
  • NUMERIC
  • FLOAT
  • DOUBLE
  • BIT
  • DATE
  • DATETIME
  • TIMESTAMP
  • TIME
  • YEAR
  • CHAR
  • VARCHAR
  • BINARY
  • VARBINARY
  • BLOB
  • TEXT
  • ENUM
  • SET
  • GEOMETRY
  • POINT
  • LINESTRING
  • POLYGON
  • MULTIPOINT
  • MULTILINESTRING
  • MULTIPOLYGON
  • GEOMETRYCOLLECTION
  • JSON

このガイドでは、これらのうち最も一般的なものをさらに詳しく解説します。

MySQL のデータ型を使い始める

型を使い始めるにあたり、型だけではデータ検証の完全な解決策ではなく、あくまでその一部であることを覚えておくことが重要です。制約のような他のデータベースツールも、正確性を定義する上で役割を果たします。それでも、データ型は無効なデータに対する最初の防衛線となることが多いです。

多くの場合、MySQL が提供する一般的な型は、格納するデータの種類に適しています。たとえば、幾何学的な点の座標を2つの異なる数値列に格納することもできますが、提供されているpointは、この種の情報を正確に格納および検証するために特別に構築されています。型を選択する際は、ユースケースに適用できる最も具体的な型を使用しているかを確認してください。

数値と数値データ

MySQL には、さまざまなシナリオに適した広範な数値データ型が含まれています。適切な型は、格納する値の正確な性質と、精度要件によって異なります。

整数

整数データ型は、分数や小数を伴わない数値を格納するために使用される型のカテゴリです。これらは正または負の値であり、異なる整数型は異なる範囲の数値を格納できます。許容値の範囲が狭い整数型は、範囲が広い整数型よりも少ない領域を占めます。

基本的な整数型の一覧には以下が含まれます

整数型長さ適用可能な符号付き範囲適用可能な符号なし範囲
TINYINT1バイト-128から1270から255
SMALLINT2バイト-32768から327670から65535
MEDIUMINT3バイト-8388608から83886070から16777215
INT4バイト-2147483648から21474836470から4294967295
BIGINT8バイト-2^63から2^63-10から2^64-1

上記の型は、有効な範囲によって制限されます。範囲外の値はエラーになります。

上記の型に加えて、MySQL は SERIAL と呼ばれるエイリアスも認識します。列を SERIAL としてマークすると、BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE というプロパティが付与されます。これは、一般的な主キー列のプロパティを簡潔に記述するために使用されます。レコードが追加されるたびに、列は新しい一意の値を自動的に割り当てます。

固定小数点

固定小数点型は、小数を伴う数値に可能な精度または特定性の量を制御するために使用されます。MySQL では、これは精度とスケールの2つの要素を操作することで制御できます。

精度は、数値が持つことができる合計桁数の最大値です。対照的に、スケールは小数点の右側の桁数です。これらの数値を操作することで、数値の小数部分と非小数部分の許容される大きさを制御できます。

これら2つの引数は、numeric または decimal データ型 (MySQL ではこれら2つの型は同義です) を使用して任意精度を制御するために使用されます。numeric 型は0から2つの引数を取ります。

引数なしの場合、列は精度10、スケール0として定義されます。これは、列が最大10桁を保持できますが、小数点の後に桁を持つことはできないことを意味します

NUMERIC

単一の引数が提供された場合、それはスケールが0に設定された列の精度として解釈されます。これにより、整数のような数値(小数部分なし)の最大桁数を効果的に指定できます。たとえば、5桁の整数が必要な場合は、次のように指定できます

NUMERIC(5)

両方のコントロールを使用して列を設定する場合、精度に続いてスケールを指定します。MySQL は、スケール数を使用して、あらゆる入力の小数部分を正しい桁数に丸めます。MySQL は、精度とスケールを使用して、小数点の左側に許可される桁数を決定します。入力が許可された桁数を超えると、MySQL はエラーを生成します。

たとえば、合計精度5、スケール2の列を指定できます

NUMERIC(5, 2)

この列は以下の動作をします

入力値丸められた値許容される(精度に適合)?
400.28080400.28はい
8.3327998.33はい
11799.79911799.80いいえ
1179911799いいえ
2802.272802.27いいえ

浮動小数点

浮動小数点数は、小数値を表現するもう1つの方法ですが、正確で一貫した精度はありません。代わりに、浮動小数点型は最大精度の概念のみを持ち、これは多くの場合、ハードウェアのアーキテクチャとプラットフォームに関連しています。

たとえば、浮動小数点列を8桁の精度に制限するには、FLOAT 型を使用できます。これは、0から23桁の精度で4バイトを使用して結果を格納します

FLOAT(8)

同様に、DOUBLE 型はデータを格納するために8バイトを使用し、24から53桁の精度を使用できます。

これらの設計上の選択により、浮動小数点数は多数の小数を効率的に扱うことができますが、常に正確であるとは限りません。数値の内部表現により、入力と出力の間にわずかな差異が生じる可能性があります。これは、値を比較したり、浮動小数点演算を実行したり、正確な値を必要とする操作を実行したりする際に、予期しない動作を引き起こす可能性があります。

浮動小数点 vs. 数値

FLOATDOUBLE などの型で提供される浮動小数点数と、NUMERIC または DECIMAL 型で提供される固定小数点数の両方を使用して、小数値を格納できます。どちらを使用すればよいでしょうか?

一般的なルールとして、計算に正確さが必要な場合は、常に NUMERIC 型を選択するのが良いでしょう。NUMERIC 型は、値が提供されたとおりに正確に格納されるため、値の取得時や計算時の結果は完全に予測可能です。NUMERIC 型は、型が必要とする精度の量を指定し、その正確な桁数がフィールドに格納されるため、任意精度と呼ばれます。

対照的に、FLOATDOUBLE などの型は可変精度型です。それらが保持する精度の量は入力値に依存します。許容される精度レベルの終わりに達すると、残りの桁を丸めることがあり、これにより送信された値と取得された値の間に差異が生じます。

では、可変精度型はどのような場合に使用するのでしょうか? FLOATDOUBLE のような可変精度型は、正確な値が不要な場合(たとえば、いずれにせよ丸められる場合)や、速度が非常に重要なシナリオに適しています。可変精度は、一般的に NUMERIC 型よりもパフォーマンス上の利点を提供します。

文字列型

MySQL の文字型と文字列型は、固定長可変長の2つのカテゴリに分類できます。この2つの選択は、MySQL が各値に領域を割り当てる方法と、入力の検証方法に影響を与えます。

MySQL 内の最も単純な文字ベースのデータ型は、char 型です。引数なしの場合、char 型は単一の文字を入力として受け入れます

CHAR

宣言で正の整数が提供されると、char 列は指定された文字数に等しい固定長の文字列を格納します

CHAR(10)

文字列がより少ない文字数で提供された場合、長さを埋めるために空白が追加されます

入力入力文字数格納された値格納された文字数
'tree'4'tree      '10

文字列が許容される文字数よりも多い場合、MySQL はエラーを発生させます。このルールの例外として、あふれた文字がすべてスペースである場合、MySQL はフィールドに収まるように余分なスペースを単純に切り捨てます。

固定長文字フィールドの代替は可変長フィールドです。このため、MySQL は varchar 型を提供します。varchar 型は、固定サイズを持たない文字を格納します。char とは異なり、varchar は格納する最大文字数を指定せずに使用することはできません。

正の整数を使用して varchar を定義することで、最大文字列長を設定できます

VARCHAR(10)

これは、char 型を整数とともに使用する場合とは異なります。入力が最大フィールド長を満たさない場合でも、varchar は値を埋め込みません。

入力入力文字数格納された値格納された文字数
'tree'4'tree'4

文字列が最大長より大きい場合、MySQL はエラーをスローします。char フィールドに存在するのと同じ切り捨て動作がここでも発生します。つまり、あふれた文字がスペースである場合、それらは最大文字長に収まるように切り捨てられます。

MySQL は、binary および varbinary データ型もサポートしています。これらは char 型と varchar 型と同様に動作しますが、文字文字列ではなくバイナリ文字列を格納します。これは、それらの格納方法や操作方法(比較、ソートなど)に影響を与えます。

binary および varbinary 型の場合、列型を定義する際に指定される整数は、文字数ではなくバイト数を表します。

MySQL が文字列および文字格納のために提供する他の2つのデータ型は、blob および text です。これらの型は、それぞれ varchar 型と varbinary 型と同様に動作し、大きなオブジェクトを格納することを目的としています。これらはほとんどその対応する型と同じように動作しますが、デフォルト値を持てないことや、インデックスを作成する際にプレフィックス長が必要となるなどのいくつかの違いがあります。

ブール値

MySQL には、真偽値を表現するためのネイティブなブール型は実際にはありません。

MySQL は、他のデータベースシステムとの互換性のために BOOL または BOOLEAN 型を認識します。しかし、その内部実装では、値を格納するために TINYINT(1) 列を使用し、一連のルールに基づいて真偽値として解釈します。

ブール値のコンテキストで数値を解釈する場合、0 の値は偽と見なされます。0以外のすべての値は真と見なされます。

MySQL は、ブールリテラル TRUE および FALSE を認識し、格納する際に TRUE を 1 に、FALSE を 0 に変換します。

日付と時刻

MySQL は、日付、時刻、およびその両方の組み合わせを表現する機能をサポートしています。

日付

The date 型は、関連する時刻値なしで日付を格納できます

DATE

When processing input for date 列の入力を処理する際、MySQL はさまざまな形式を解釈して、格納すべき正しい日付を判断できます。ただし、構成要素は常に年、月、日の順序でなければなりません。STR_TO_DATE() 関数は、他の日付形式を MySQL が正しく解釈する形式に変換するのに役立ちます。

日付を表示する際、MySQL は YYYY-MM-DD 形式を使用します。DATE_FORMAT() 関数を使用して、出力を他の形式にフォーマットすることができます。

The date 型は、1000-01-01 から 9999-12-31 までの範囲の値を格納できます。

時刻

The time データ型は、関連するタイムゾーンや日付なしで、特定の一日の時刻を格納できます。

When processing input for time 列の入力を処理する際、MySQL は複数の形式を解釈して、格納すべき正しい時刻を判断できます。入力にコロンが含まれる場合、通常は hh:mm:ss として解釈されます。短縮された値(コロンが1つのみの場合)は hh:mm として解釈されます。入力にコロンが含まれない場合、時刻はまず最も小さい値を埋めるように処理されます。たとえば、1045 は10分45秒として解釈されます。

MySQL は、小数点が与えられた場合、秒の小数部分もサポートしています。小数点以下最大6桁の精度で格納されます。time 列の値の範囲は、-838:59:59.000000 から 838:59:59.000000 までです。

時刻値を表示する際、MySQL は hh:mm:ss 形式を使用します。日付と同様に、TIME_FORMAT() という関数が提供されており、他の形式で時刻値を表示できます。

タイムスタンプと日時

MySQL は、特定の時点を表す日付と時刻の組み合わせであるタイムスタンプを、timestamp 型と datetime 型の2種類のバリエーションで表現できます。

The datetime 型は、1000-01-01 00:00:00 から 9999-12-31 23:59:59 までの値を表現できます。time 型と同様に、小数点以下最大6桁の秒の小数部分を含めることもできます。

The timestamp 型は、1970-01-01 00:00:01 UTC から 2038-01-19 03:14:07 UTC までの値を表現できます。秒の小数部分も処理できます。timestamp 値を格納する場合、すべての値は指定されたタイムゾーンから UTC に変換されて格納され、取得時にローカルタイムゾーンに変換し直されます。datetime 型はこれを行いません。

MySQL 8.0.19 以降では、timestamp を格納する際にタイムゾーンオフセットを含めることで、格納される値のタイムゾーンを明示的に設定できます。これは、時刻コンポーネントの後にオフセットを示すスペースなしで値を記述することで行います。受け入れられる値の範囲は -14:00 から +14:00 であり、これは格納される値の UTC からのオフセットを表します。

datetime 型と timestamp 型のどちらを使用して日付と時刻の値を格納するかを決定する際には、それぞれが何に最適であるかによって区別することが役立ちます。

datetime 値は、取得される場所の暦と時計に関連する特定の年月日と時刻として考えてください。例えば、ある人が夜11時に就寝した場合、その人が現在どのタイムゾーンにいても、datetime 値はその値を表現できます。

一方、timestamp 値は、タイムゾーンをまたいでも曖昧さのない特定の時点を表現するのに最適です。ビデオ通話の招待を送る際、timestamp 値を使用すれば、参加者がどのタイムゾーンにいても全員が同じ時間に会議に参加できることを確実にできます。

その他の便利な型

上で詳しく説明した型に加えて、特定のシナリオで役立つ追加の型があります。これらを簡潔に説明し、どのように使用し、いつ役立つかのアイデアを提供します。

列挙型とセット型

ユーザーが列の有効な値を指定できる関連する2つの型は、enum 型と set 型です。

The enumは、列が作成される際にユーザーが有効な値のコレクションを定義できる文字列型です。定義された値のいずれかに一致する値は受け入れられ、その他の値はすべて拒否されます。これは、特定のオプションのセットから選択できるドロップダウンメニューと同様に機能します。たとえば、season という enum は、winterspringsummerautumn の値で作成できます。

enum 列を作成するには、型を enum と指定し、可能な値を文字列として、カンマで区切って括弧内に記述します。例:

season ENUM('winter', 'spring', 'summer', 'autumn')

ユーザー定義型の同様の型に、setがあります。enum 型と同様に、set 型は定義時にユーザーが有効な値を文字列として指定できます。これら2つの型の違いは、set では各レコードに複数の値を格納できる点です。

たとえば、ボランティアが作業可能な曜日を表す列が必要な場合、次のような set 列を持つことができます

availability SET('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday')

作成した availability 列に値を入力する際は、ボランティアが利用可能なすべての日をカンマで区切った単一の文字列を提供します。例:

'monday,tuesday,wednesday,thursday,friday'
'sunday,saturday'
'monday,wednesday,friday'
'thursday'

MySQL の set 型の場合、入力内の重複値は常に削除され、取得時には、列に入力されたときの順序に関係なく、set 定義で使用された順序に従って値が返されます。

JSON

MySQL は、json 型を使用してJSON形式の列をサポートしています。json として格納されたデータは、サーバーが JSON 値を操作するために文字列を解釈する必要がないように、より高速な実行と処理のためにバイナリ形式で格納されます。

JSON

JSON 列を操作するために、MySQL はドキュメント内の値を扱うための多くの関数を提供しています。

結論

この記事では、MySQL データベースを扱う際に役立つ最も一般的なデータ型の多くを網羅しました。このガイドでは触れていない追加の型もありますが、ここで説明した型はほとんどのユースケースにとって良い出発点となります。

有効な値を制御し、データを期待通りに操作できるよう、型システムを適切に使用することが重要です。データに適さない型を選択すると陥る落とし穴があるため、データ型を決定する前に検討することはほとんどの場合で価値があります。

MySQL データベースを操作するために Prisma Client を使用している場合、一般的な MySQL 型と Prisma 型のマッピングは、Prisma の MySQL データコネクタドキュメントで確認できます。

よくある質問

DECIMAL 列の宣言構文は DECIMAL(M, D) です。引数の値の範囲は以下のとおりです

  • M は最大桁数(精度)です。範囲は1から65です。
  • D は小数点の右側の桁数(スケール)です。範囲は0から30で、M を超えてはなりません。

MySQL における文字列型のストレージ要件は、以下の表で示され、L は指定された文字列値の実際のバイト長を表します。

データ型必要なストレージ
TINYTEXTL + 1 バイト (ただし L < 2^8)
TEXTL + 2 バイト (ただし L < 2^16)
MEDIUMTEXTL + 3 バイト (ただし L < 2^24)
LONGTEXTL + 4 バイト (ただし L < 2^32)

TEXTVARCHAR は、同様に固定サイズなしで文字を格納します。

VARCHAR は、格納する最大文字数を指定せずに使用できない点が異なりますが、TEXT はこれを必要としません。

VARCHAR の定義構文の例は次のようになります

VARCHAR(10)

VARCHAR 列の値は可変長文字列です。最大長は0から65,535までの値で指定できます。

VARCHAR の実効最大長は、すべての列の最大行サイズ(65,535バイト)に左右されます。

ENUM は、列が可能な値の限られたセットを持つ状況において有利なストレージ型です。

すべての列と同じストレージ要件があります

データ型必要なストレージ
ENUM1または2バイト(列挙値の数による、最大65,535値)
著者について
Justin Ellingwood

Justin Ellingwood

ジャスティンは2013年からデータベース、Linux、インフラ、開発者ツールについて執筆しています。現在はベルリンで妻と2匹のウサギと暮らしています。通常、三人称で書く必要はないため、関係者全員にとって安心です。
© . All rights reserved.