SQL のデータ型の概要
JavaScript とは異なり、SQL には強力な型指定があります。すべてのテーブルのすべての列には、独自の固定データ型があります。
データ型はたくさんありますが、Java 言語とは異なり、あらゆる状況に対応できるデータ型があるため、それほど多くのデータ型が存在するわけではありません。データベースはデータのサイズに大きく依存するため、多くのデータ型は長さだけが異なります。
データ型は合計で 5 つのグループに分類できます。
- 数値型
- 文字列型
- 日付と時刻を保存するタイプ
- オブジェクト: 通常はバイトのコレクションとして表現されます。
- トランスポート: JSON および XML
通常、異なる DBMS には独自のデータ型が存在します。各 DBMS には独自の専門分野があるため、新しいデータ型を追加することは非常に一般的なことです。
もう 1 つは、新しいデータ型を追加するだけでは十分ではなく、そのデータ型で動作する関数を追加し、この動作を便利かつ高速にする必要があるということです。
産業用 (エンタープライズ) DBMS を扱う場合、おそらくそのデータ型とその機能を扱う必要があります。そのためには、2〜5冊の良い本を読む必要があります。
SQL についての知識の一環として、データ型の 3 つの主要なグループを検討します。
- 数字
- 文字列
- 日付
SQL の数値型
SQL では、数値型は 3 つのグループに分類されます。
- 整数型
- 固定小数点数(固定小数点以下桁数)
- 浮動小数点数
整数から始めましょう。それらは 5 つだけあり、1 つの表で説明できます。
# | 型名 | バイト単位の長さ | Java からのアナログ | 最小値 | 最大値 |
---|---|---|---|---|---|
1 | タイイント | 1 | バイト | -128 | 127 |
2 | スモールント | 2 | 短い | -32.768 | 32.767 |
3 | ミディアムミント | 3 | -8,388,608 | 8,388,607 | |
4 | INT | 4 | 整数 | -2,147,483,648 | 2,147,483,647 |
5 | BIGINT | 8 | 長さ | -2 63 | 2 63-1 |
データ型は Java データ型とよく似ていますが、3 バイト長の整数型もあります。これはサイズを節約するために行われます。
次に浮動小数点型が来ます。Java と同じように、浮動小数点型は 2 つだけです。
# | 型名 | バイト単位の長さ | Java からのアナログ | 最小値 | 最大値 |
---|---|---|---|---|---|
1 | 浮く | 4 | 浮く | -3.40E+38 | +1.18E+38 |
2 | ダブル | 8 | ダブル | -1.79E+308 | +1.79E+308 |
繰り返しますが、新しいものは何もありません。すべては Java と同じです。ただし、Java とは異なり、SQL には固定小数点実数という別の特殊な型があります。それは10進数と呼ばれます。
通常、このタイプは金額を保管するために使用されます。このタイプの名前を記述する場合、通常、その名前の後に、小数点の前後にその数値が小数点以下何桁あるかが示されます。一般的な形式は次のようになります。
DECIMAL(total_characters, after_comma)
そして小さな例:
salary DECIMAL(5,2)
これは、給与列に整数 (最大小数点以下 3 桁) と小数部 (小数点以下 2 桁) を含めることができるという事実を説明した方法です。
DECIMAL 型がサポートする最大文字数は 65 です。
SQLの文字列型
データベース内の行は、次の 2 つの形式で保存できます。
- 固定長文字列
- 可変長の文字列
固定長文字列はCHARとして指定されます。
CHAR(length)
固定長とは、この列のすべての値に厳密に固定された数の文字が含まれることを意味します。
固定長文字列の例:
country_code CHAR(2)
可変長文字列は、VARCHAR型で指定されます。
VARCHAR(max_length)
可変長とは、この列のすべての値に任意の長さのテキストが含まれるが、最大長を超えないことを意味します。
可変長文字列の例:
phone VARCHAR(12)
固定長文字列には非常に大きな利点があります。クライアントが SQL サーバーにテーブルの 1,000,000 番目の行を返すように要求し、テーブル内の行が固定長である場合、行の長さがわかれば、目的の行に関連するバイトを簡単に計算できます。行。
行の長さが可変の場合、テーブル内で目的の行をすぐに見つけることができません。ArrayList と LinkedList へのアクセス速度を思い出してください。ここでも状況はほぼ同じです。
データ型に応じて、さまざまな長さの文字列がテーブルにどのように格納されるかを比較してみましょう。
ライン | CHAR(4) | 保存するバイト | VARCHAR(4) | 保存するバイト | |
---|---|---|---|---|---|
」 | 「」 | 4 | 」 | 1 | |
「アブ」 | 「アブ」 | 4 | 「アブ」 | 3 | |
'あいうえお' | 'あいうえお' | 4 | 'あいうえお' | 5 | |
「abcdefgh」 | 'あいうえお' | 4 | 'あいうえお' | 5 |
ノート。VARCHAR 型では、文字列の長さを追加で格納する必要があるため、同じ長さに対してさらに 1 バイトが必要です。
SQL の一時型
SQL には、日付と時刻を格納するための特別な型もあります。全部で5種類あります。
# | 型名 | Java DateTime API からのアナログ | 例 | 最小値 | 最大値 |
---|---|---|---|---|---|
1 | 日にち | ローカル日付 | 「2022-06-30」 | 「1000-01-01」 | 「9999-12-31」 |
2 | 時間 | 現地時間 | 'hh:mm:ss[.fraction]' | 「-838:59:59.000000」 | 「838:59:59.000000」 |
3 | 日付時刻 | ローカル日時 | 「1000-01-01 00:00:00.000000」 | 「9999-12-31 23:59:59.999999」 | |
4 | タイムスタンプ | 日にち | 「1970-01-01 00:00:01.000000」 | 「2038-01-19 03:14:07.999999」 | |
5 | 年 | 1901年 | 2155 |
クエリ内のすべてのデータは、一重引用符で囲まれた文字列として書き込まれます。エントリの形式は最大から最小の順になります。
- 年
- 月
- 日
- 時間
- 分
- 2番
- 秒の小数部分
DATE、TIME、および DATETIME 型は、従来、Java DateTme API の型 (LocalDate、LocalTime、LocalDateTime) の類似物と考えることができます。ロジックはほぼ同じです。
TIMESTAMP タイプは、1970 年初頭 (UNIX オペレーティング システムの標準) 以降のデータをミリ秒単位で保存します。Java 言語の Date 型で保存されるのはこの形式です。
最後に、YEAR 型があります。これは 1 バイト長で、1 から 255 までの値を格納します。したがって、利用可能な年の範囲は 1901 年から 2155 年です。値 0 は NULL 値のエンコードに使用されるため、1900 年はこの型では格納できません。
SQLでのオブジェクトの保存
非常に長いオブジェクトやテキストを保存するための特別なタイプがあります。それらについては詳しく説明しませんが、とりあえず列挙してみます。
# | 型名 | 説明 |
---|---|---|
1 | 文章 | 長いテキストを保存するために使用されます。このフィールドで比較および並べ替えを行う場合、最初の 100 文字のみが使用されます。 |
2 | BLOB | 名前は Byte Large Object の略です。単なるバイトのコレクションとして保存されます。たとえば、データベースに写真を保存するために使用できます。 |
3 | クロブ | 名前は Char Large Object の略です。長いテキストを保存するために使用されます。 |
4 | ENUM | 固定の値セットを設定し、そのうちの 1 つを値として保存できます。 |
5 | 設定 | 値の固定セットを設定し、そのサブセットを値として保存できます。通常、それらはバイナリマスクとして保存されます。 |
理論的には、任意の Java オブジェクトをバイトのセットとしてシリアル化し、BLOB としてデータベースに保存できます。オブジェクトの保存は問題ありません。彼とさらに協力するにはどうすればよいでしょうか?
テーブルに 100 万個のオブジェクトがシリアル化された形式で格納されているとします。それらをどのように検索するのでしょうか? DBMS は、データを操作するための広範な機能セットを提供する場合にのみ、特定のタイプのデータをサポートします。