はじめに
一般に、リレーショナルデータベースの主な機能の1つは、含まれるデータの形式を正確に指定するスキーマまたはテーブル構造を定義する機能です。これは、これらの構造に含まれる列とそのデータ型を指定することによって行われます。 および制約。
データ型は、受け入れて保存するデータの一般的なパターンを指定します。値は、MySQLに受け入れられるために、それらが概説する要件に準拠する必要があります。カスタム要件を定義することは可能ですが、データ型は、MySQLが入力を検証し、適切な操作を使用してデータを操作できるようにする基本的な構成要素を提供します。
MySQLには、値が適切な型に準拠していることをラベル付けおよび検証するために使用されるさまざまなデータ型が含まれています。このガイドでは、MySQLで使用できる最も一般的なデータ型、それらが使用するさまざまな入力および出力形式、およびアプリケーションのニーズを満たすためにさまざまなフィールドを構成する方法について説明します。
MySQLのデータ型は何ですか?
詳細に入る前に、MySQLが提供するデータ型の概要を見てみましょう。
MySQLは、さまざまなタイプの単純なデータと複雑なデータに適した妥当な範囲のデータタイプをサポートしています。これらには以下が含まれます:
-
TINYINT
-
SMALLINT
-
MEDIUMINT
-
INT
-
BIGINT
-
10進数
-
NUMERIC
-
FLOAT
-
DOUBLE
ビットコード>
日付
-
DATETIME
-
TIMESTAMP
時間コード>
-
YEAR
-
CHAR
-
VARCHAR
-
BINARY
-
VARBINARY
-
BLOB
-
TEXT
-
ENUM
-
SET
-
GEOMETRY
ポイント
-
LINESTRING
-
POLYGON
マルチポイント
-
MULTILINESTRING
-
MULTIPOLYGON
-
GEOMETRYCOLLECTION
-
JSON
このガイドでは、これらの中で最も一般的なものについて詳しく説明します。
MySQLデータ型の使用を開始する
型を使い始めるときは、型だけがデータ検証の完全なソリューションであるとは限らず、コンポーネントであることを覚えておくことが重要です。制約などの他のデータベースツールも、正確さを定義する上で果たす役割があります。それでも、データ型は多くの場合、無効なデータに対する最初の防衛線です。
多くの場合、MySQLが提供する一般的なタイプは、保存するデータの種類に適しています。たとえば、幾何学的な点の座標を2つの異なる数値列に格納できますが、提供されている point
typeは、このタイプの情報を正確に格納および検証するために構築されたものです。タイプを選択するときは、ユースケースに適用できる最も具体的なタイプを使用していることを確認してください。
数値と数値
MySQLには、さまざまなシナリオに適したさまざまな数値データ型が含まれています。適切なタイプは、保存する予定の値の正確な性質と精度の要件によって異なります。
整数
整数 データ型は、小数や小数を含まない数値を格納するために使用される型のカテゴリです。これらは正または負の値のいずれかであり、異なる整数タイプは異なる範囲の数値を格納できます。許容値の範囲が狭い整数型は、範囲が広い整数型よりも占有するスペースが少なくなります。
整数型の基本的なリストには、次のものが含まれます。
整数型 | 長さ | 該当する署名された範囲 | 該当する符号なし範囲 |
---|---|---|---|
TINYINT | 1バイト | -128〜127 | 0〜255 |
SMALLINT | 2バイト | -32768〜32767 | 0〜65535 |
MEDIUMINT | 3バイト | -8388608から8388607 | 0から16777215 |
INT | 4バイト | -2147483648から2147483647 | 0から4294967295 |
BIGINT | 8バイト | -2^63から-2^63-1 | 0から2^64-1 |
上記のタイプは、有効な範囲によって制限されます。範囲外の値はエラーになります。
上記のタイプに加えて、MySQLは SERIAL
と呼ばれるエイリアスも認識します 。列をSERIAL
としてマークする 次のプロパティが与えられます: BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
。これは、一般的な主キー列のプロパティの省略形として使用されます。レコードが追加されるたびに、列に新しい一意の値が自動的に割り当てられます。
固定小数点
固定小数点タイプは、精度の量を制御するために使用されます または、小数の数値に対して可能な特異性。 MySQLでは、これは精度とスケールの2つの要素を操作することで制御できます。
精度 は、数値が持つことができる合計桁数の最大量です。対照的に、スケール 小数点の右側の桁数です。これらの数値を操作することにより、数値の分数成分と非分数成分の大きさを制御できます。
これらの2つの引数は、数値
を使用して任意精度を制御するために使用されます。 または10進数
データ型(これらの2つの型はMySQLでは同義です)。 数値
タイプは0から2つの引数を取ります。
引数がない場合、列は10の精度と0のスケールを持つものとして定義されます。これは、列が最大10桁を保持できることを意味しますが、これらはいずれも小数点以下にすることはできません。
NUMERIC
単一の引数が指定された場合、それはスケールが0に設定された列の精度として解釈されます。これにより、整数のような数値(小数または小数の成分なし)の最大桁数を効果的に指定できます。たとえば、5桁の整数が必要な場合は、次のように指定できます。
NUMERIC(5)
両方のコントロールを使用して列を構成する場合は、精度に続いてスケールを指定します。 MySQLは、スケール番号を使用して、入力の小数コンポーネントを正しい桁数に丸めます。 MySQLは、精度とスケールを使用して、小数点の左側で許可される桁数を決定します。エントリが許可された桁数を超えると、MySQLはエラーを生成します。
たとえば、合計精度が5、スケールが2の列を指定できます。
NUMERIC(5, 2)
この列の動作は次のようになります。
入力値 | 丸められた値 | 承認済み(精度に適合)? |
---|---|---|
400.28080 | 400.28 | はい |
8.332799 | 8.33 | はい |
11799.799 | 11799.80 | いいえ |
11799 | 11799 | いいえ |
2802.27 | 2802.27 | いいえ |
浮動小数点
浮動小数点数は10進数を表す別の方法ですが、正確で一貫した精度はありません。代わりに、浮動小数点型には、ハードウェアのアーキテクチャとプラットフォームに関連することが多い最大精度の概念しかありません。
たとえば、浮動小数点列の精度を8桁に制限するには、 FLOAT
を使用できます。 タイプ。0〜23桁の精度で4バイトを使用して結果を格納します:
FLOAT(8)
同様に、 DOUBLE
typeは8バイトを使用してデータを格納し、24〜53桁の精度を使用できます。
これらの設計上の選択により、浮動小数点数は小数点以下の桁数が多い数で効率的に機能しますが、常に正確であるとは限りません。数値の内部表現により、入力と出力の間にわずかな違いが生じる場合があります。これにより、値を比較したり、浮動小数点演算を実行したり、正確な値を必要とする演算を実行したりするときに、予期しない動作が発生する可能性があります。
浮動小数点と数値
FLOAT
などのタイプによって提供される両方の浮動小数点数 およびDOUBLE
NUMERIC
によって提供される固定小数点数 またはDECIMAL
タイプは、10進値を格納するために使用できます。どちらを使用するかをどうやって知るのですか?
一般的なルールとして、計算に正確さが必要な場合は、 NUMERIC
タイプは常により良い選択です。 NUMERIC
typeは、提供されたとおりに値を格納します。つまり、値を取得または計算するときに、結果は完全に予測可能です。 NUMERIC
タイプは、タイプに必要な精度の量を指定し、その正確な桁数をフィールドに格納するため、任意精度と呼ばれます。
対照的に、 FLOAT
のようなタイプ およびDOUBLE
可変精度タイプです。それらが維持する精度の量は、入力値によって異なります。許容される精度レベルの最後に達すると、残りの桁が丸められ、送信された値と取得された値に差が生じる可能性があります。
では、いつ可変精度タイプを使用しますか? FLOAT
などの可変精度タイプ およびDOUBLE
正確な値が不要なシナリオ(たとえば、とにかく丸められる場合)や、速度が非常に重要なシナリオに適しています。可変精度は通常、 NUMERIC
よりもパフォーマンス上の利点があります タイプ。
文字列タイプ
MySQLの文字タイプと文字列タイプは、次の2つのカテゴリに分類できます。固定長 および可変長 。これら2つの選択は、MySQLが各値にスペースを割り当てる方法と入力を検証する方法に影響します。
MySQL内の最も単純な文字ベースのデータ型は、 char
です。 タイプ。引数がない場合、 char
タイプは入力として単一の文字を受け入れます:
CHAR
宣言に正の整数が指定されている場合、 char
列には、指定された文字数に等しい固定長の文字列が格納されます:
CHAR(10)
文字列の文字数が少ない場合は、長さを埋めるために空白が追加されます:
入力 | 入力文字数 | プリペイド | 保存されている文字の数 |
---|---|---|---|
'ツリー' | 4 | 'ツリー' | 10 |
許可された文字数を超える文字列が指定された場合、MySQLはエラーを発生させます。このルールの例外として、オーバーフローする文字がすべてスペースである場合、MySQLはフィールドに合うように余分なスペースを切り捨てるだけです。
固定長文字フィールドの代わりに、可変長フィールドがあります。このために、MySQLは varchar
を提供します タイプ。 varchar
タイプは、固定サイズのない文字を格納します。 char
とは異なり 、 varchar
保存する最大文字数を指定せずに使用することはできません。
varchar
を定義する 正の整数を使用すると、文字列の最大長を設定できます:
VARCHAR(10)
これは、 char
を使用する場合とは異なります。 そのvarchar
に整数を入力します 入力が最大フィールド長を満たさない場合、値は埋め込まれません:
入力 | 入力文字数 | プリペイド | 保存されている文字の数 |
---|---|---|---|
'ツリー' | 4 | 'ツリー' | 4 |
文字列が最大長よりも大きい場合、MySQLはエラーをスローします。 char
に存在するのと同じ切り捨て動作 フィールドはここで発生します。オーバーフローする文字がスペースの場合、最大文字長の範囲内に収まるように切り捨てられます。
MySQLはbinary
もサポートしています およびvarbinary
データ型。これらはchar
と同じように動作します およびvarchar
タイプしますが、文字列ではなくバイナリ文字列を格納します。これは、それらがどのように保存および操作されるか(比較、並べ替えなど)に影響します。
binary
の場合 およびvarbinary
タイプ。列タイプを定義するときに指定される整数は、文字数ではなくバイト数を表します。
MySQLが文字列と文字ストレージに提供する他の2つのデータ型は、 blob
です。 およびtext
。これらのタイプは、 varchar
と同様に機能します およびvarbinary
それぞれタイプし、大きなオブジェクトを格納するためのものです。これらは対応するものとほとんど同じように動作しますが、デフォルト値を使用できなくなったり、インデックスを作成するときにプレフィックスの長さが必要になるなど、いくつかの違いがあります。
ブール値
MySQLには、実際にはtrue値とfalse値を表すネイティブブール型がありません。
MySQLはタイプBOOL
を認識します またはBOOLEAN
他のデータベースシステムとの互換性のために。ただし、その内部実装は TINYINT(1)
を使用します 値を格納し、一連のルールに基づいてそれらをtrueまたはfalseとして解釈する列。
ブールコンテキストで数値を解釈する場合、 0
の値 偽と見なされます。ゼロ以外の値はすべて真と見なされます。
MySQLはブールリテラルTRUE
を認識します およびFALSE
TRUE
を変換します 1に、 FALSE
保存するときは0にします。
日付と時刻
MySQLは、日付、時刻、および2つの組み合わせの表現をサポートしています。
日付
日付コード> タイプは、時間値が関連付けられていない日付を保存できます:
DATE
date
の入力を処理する場合 列の場合、MySQLはさまざまな形式を解釈して、保存する正しい日付を決定できます。ただし、構成部品は常に同じ順序(年、月、日)である必要があります。 STR_TO_DATE()
関数は、他の日付形式をMySQLが正しく解釈する形式に変換するのに役立ちます。
日付を表示するとき、MySQLは YYYY-MM-DD
を使用します フォーマット。 DATE_FORMAT()
を使用できます 出力を他の形式でフォーマットする関数。
日付コード> typeは、
1000-01-01
の範囲の値を格納できます 9999-12-31
へ 。
時間
時間コード> データ型には、タイムゾーンや日付を関連付けずに特定の時刻を保存できます。
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は、タイムスタンプを表すことができます。これは、特定の瞬間を表すために使用される日付と時刻の組み合わせであり、2つの異なるバリエーションがあります。タイムスタンプ
を使用する タイプとdatetime
タイプ。
datetime
typeは、 1000-01-01 00:00:00
の値を表すことができます to 9999-12-31 23:59:59
。 time
と同様に、最大6桁の秒数を含めることもできます。 タイプ。
タイムスタンプ
typeは、 1970-01-01 00:00:01
の値を表すことができます UTCから2038-01-1903:14:07
UTC。フラクショナルセコンドも処理できます。 タイムスタンプ
を保存する場合 値の場合、すべての値は、保存のために指定されたタイムゾーンからUTCに変換され、取得時にローカルタイムゾーンに変換されます。 datetime
タイプはこれを行いません。
MySQL 8.0.19以降では、タイムスタンプ
を保存するときにタイムゾーンオフセットを含めることができます。 保存された値のタイムゾーンを明示的に設定します。これを行うには、時間コンポーネントの後に値を含めます。オフセットを示すスペースはありません。受け入れられる値の範囲は-14:00
です。 +14:00
へ 、UTCからの保存された値のオフセットを表します。
datetime
を使用して日付と時刻の値を保存するかどうかを決定する場合 またはtimezone
タイプの場合、それらを最適なもので区切ると役立つことがよくあります。
datetime
について考えてみてください 取得される場所に関係なく、カレンダーと時計に関連する特定の日付と時刻としての値。人が夜の午後11時に就寝する場合、 datetime
値は、その人が現在どのタイムゾーンにいるかに関係なく、その値を表すことができます。
一方、 timezone
値は、タイムゾーン間で明確な特定の瞬間を表すのに最適です。ビデオ通話の招待状を送信するには、 timezone
valueは、参加者がどのタイムゾーンにいるかに関係なく、すべての人が同時に会議を開催できるようにすることができます。
その他の便利なタイプ
上記である程度詳しく説明したタイプに加えて、特定のシナリオで役立つ追加のタイプがあります。これらについて簡単に説明し、使用方法と有用性について説明します。
列挙型とセット型
ユーザーが列の有効な値を指定できるようにする2つの関連するタイプは、 enum
です。 およびset
タイプ。
列挙型
typeは、列の作成時にユーザーが有効な値のコレクションを定義できるようにする文字列タイプです。定義された値の1つに一致する値はすべて受け入れられ、他のすべての値は拒否されます。これは、特定のオプションセットから選択できるという点で、ドロップダウンメニューと同様に機能します。たとえば、 enum
シーズン
と呼ばれます winter
の値で作成できます 、 spring
、 summer
、および autumn
。
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'
set
の場合 MySQLのタイプでは、入力の重複値は常に削除され、取得時に、値は set
で使用される順序に従います。 列に入力するときの順序に関係なく定義。
JSON
MySQLは、 json
を使用してJSONの列をサポートします タイプ。 json
として保存されたデータ サーバーがJSON
を操作するために文字列を解釈する必要がないように、実行と処理を高速化するためにバイナリで保存されます 値。
JSON
JSON
を操作するには 列、MySQLは、ドキュメント内の値を処理するための多くの関数を提供します。
結論
この記事では、MySQLデータベースを操作するときに役立つ最も一般的なデータ型の多くについて説明しました。このガイドに記載されていない、知っておくと役立つタイプが他にもありますが、これらはほとんどのユースケースの出発点として適しています。
有効な値を制御し、期待どおりにデータを操作できるように、型システムを適切に使用することが重要です。データに適さないタイプを選択した場合に遭遇する可能性のある落とし穴があるため、ほとんどの場合、データタイプにコミットする前にそれを検討する価値があります。
Prisma Clientを使用してMySQLデータベースを操作している場合は、PrismaのMySQLデータコネクタのドキュメントで、いくつかの一般的なMySQLタイプとPrismaタイプの間のマッピングを見つけることができます。