テーブル列に適切なデータ型を選択することは重要な決定です。データ型変換の必要性を減らし、データベースクエリのパフォーマンスを向上させ、ストレージ要件を最小限に抑えます。
このガイドでは、リレーショナルデータベース管理システム(RDBMS)で使用されるさまざまなデータ型について説明します。これらのデータ型は、テーブルを作成または変更するとき、またはデータベースのストアドプロシージャで変数を宣言するときに使用できます。よく知られているRDBMSには、MySQLとPostgreSQLがあります。
SQLバイナリデータ型
バイナリデータを保存するには(0
または1
)、BINARY
を使用します およびVARBINARY
データ型。 BINARY
データ型は固定長のバイナリデータを格納し、VARBINARY
可変長のバイナリデータを格納します。これらのデータ型は両方とも、ビットの文字列(0
)を格納するために使用されます と1
の)。それらの値は、0x
のプレフィックスで示される16進表現を使用して割り当ておよび取得されます。 。両方のBinary
の列(または変数) およびVarBinary
データ型は、JPEG、BMP、ドキュメントファイルなどの画像ファイルのコンテンツを保存するために使用されます。
たとえば、10進値が63
の場合 、その16進値は0x3F
で表されます それに相当するバイナリビット文字列は111111
です。 。これらのバイナリ文字列の値とそれらがどのように格納されるかを理解するには、以下の例を検討してください。
注 特に明記されていない限り、このガイドで示されているすべてのデータベースコマンドは、両方の MySQLで適切に機能します。 およびPostgreSQL 。
-
コマンドラインから、
BinaryExample
というテーブルを作成します 以下に示すように:CREATE TABLE BinaryExample ( BinaryCol BINARY (10), VarBinaryCol VARBINARY (10) );
-
BinaryExample
に行を挿入します テーブル:INSERT INTO BinaryExample (BinaryCol, VarBinaryCol) VALUES (0x4D7953514C, 0x39274D);
-
BinaryExample
からデータを選択します テーブル:SELECT BinaryCol, VarBinaryCol FROM BinaryExample;
出力は次のようになります。
+------------------------+----------------------------+ | BinaryCol | VarBinaryCol | +------------------------+----------------------------+ | 0x4D7953514C0000000000 | 0x39274D | +------------------------+----------------------------+
ご覧のとおり、BinaryCol
データは末尾のゼロで最大列サイズに埋め込まれますが、VarBinaryCol
データ列はそうではありません。これは、VarBinaryCol
の列が原因です。 可変長として定義されます。
注 BinaryおよびVarBinaryデータ型の最大サイズ(長さ)は、データベースの実装によって異なります。それらは一般的に非常に大きいです(8,000バイト以上)。一部のデータベース実装には、これらのコアデータ型に対するバイナリ拡張機能があり、数ギガバイトのサイズでデータを格納できます。
SQL数値データ型
使用可能な数値データ型は、整数数値データ型、正確な数値データ型、および近似数値データ型に分類できます。以下のセクションでは、各グループについて説明します。
整数数値データ型
整数データ型には、符号なしと符号付きがあります。 署名なし 署名済みに対して、ゼロと正の数のみを格納できます ゼロ、正、および負の数を許可します。
ほとんどのSQL実装は、INT
の整数データ型をサポートしています。 、SMALLINT
、およびTINYINT
正と負の整数の保存用。選択する整数の数値データ型は、格納する必要のある値の範囲によって異なります。
次の表は、整数の数値データ型で許可されるストレージをバイト単位で示し、それらの最小および最大のSIGNED値を示しています。
Type | ストレージ(バイト) | 署名された最小値 | 署名された最大値 |
---|---|---|---|
INT | 4 | マイナス2 ^ 31(-2147483648) | plus 2 ^ 31(2147483647) |
SMALLINT | 2 | マイナス2 ^ 15(-32768) | plus 2 ^ 15(32767) |
TINYINT | 1 | -128 | 127 |
以下の例は、NumericExample
という名前のテーブルを使用して、整数数値データ型の最小および最大符号付き値を示しています。 。
-
コマンドラインから、
NumericExample
を作成します テーブル。CREATE TABLE NumericExample ( IntColumn INT, SmallIntColumn SMALLINT, TinyIntColumn TINYINT );
-
次の値を
NumericExample
に挿入します テーブル。INSERT INTO NumericExample (IntColumn, SmallIntColumn, TinyIntColumn) VALUES (3258594758, 32767, 255);
上記のコマンドを実行すると、
Out of range
が表示されます 以下の出力に示されているエラー。値を挿入することはできません3258594758
および255
IntColumn
へ およびTinyIntColumn
それぞれ。これは、整数データ型のSIGNEDの最大値が2147483647
であるためです。 TinyIntのそれは127
です 。ERROR 1264 (22003): Out of range value for column 'IntColumn' at row 1
-
IntColumn
の値を更新します およびTinyIntColumn
列を作成し、INSERT
を再実行します コマンド。INSERT INTO NumericExample (IntColumn, SmallIntColumn, TinyIntColumn) VALUES (2147483647, 32767, 127);
-
SELECT
を使用して列の値を取得します ステートメント:SELECT IntColumn, SmallIntColumn, TinyIntColumn FROM NumericExample;
出力は次の例のようになります:
+------------+----------------+---------------+ | IntColumn | SmallIntColumn | TinyIntColumn | +------------+----------------+---------------+ | 2147483647 | 32767 | 127 | +------------+----------------+---------------+
10進数のデータ型(正確な数値)
Decimalデータ型、DECIMAL
およびNUMERIC
、正確な固定数値を保存します。これらのデータ型は、正確な数値とも呼ばれます。 データ型。これらは、小数点の左側に整数値を格納し、小数点の右側に小数値を格納します。これらは、同じストレージ要件で機能的に同等です。これらのタイプに使用されるストレージは、指定された精度と範囲によって異なります。それらの範囲は2バイトから17バイトで、値の範囲は-10^38 +1
です。 +10^38 -1
へ 。
これらの2つのデータ型は、精度によって定義されます。 およびスケール 。精度は小数点の左右を合わせた桁数を示し、目盛りは小数点の右側の合計桁数を示します。これらの2つのデータ型は、次の構文を使用して作成されます。
DECIMAL(precision, scale)
または
NUMERIC(precision,scale)
以下の例は、10進数のデータ型を作成して使用する方法を示しています。
-
コマンドラインから、
ExactNumericExample
を作成します テーブル。CREATE TABLE ExactNumericExample ( DecimalCol DECIMAL(5,2), NumericCol NUMERIC(7,2) );
-
次の値を
ExactNumericExample
に挿入します テーブル。INSERT INTO ExactNumericExample (DecimalCol, NumericCol) VALUES (123.45, 12345.67);
-
SELECT
を使用して列の値を取得します ステートメント:SELECT DecimalCol, NumericCol FROM ExactNumericExample;
出力は次のようになります。
+------------+------------+ | DecimalCol | NumericCol | +------------+------------+ | 123.45 | 12345.67 | +------------+------------+
浮動小数点数値データ型(概算数値)
浮動小数点の数値データ型はFLOAT
です。 およびREAL
。 近似数値とも呼ばれます データ型。これらのデータ型は、浮動小数点データのバイナリ表現のため、近似値を格納します。浮動小数点列または変数を作成するための構文は次のとおりです。
Float(N)
パラメータN
フィールドが4バイトを保持するか8バイトを保持するかを示します。 N
の値 7より大きい場合は8バイトが必要です。 7以下には4バイトが必要です。このデータ型の浮動小数点精度は、-1.79E + 308
の範囲です。 1.79E + 308
へ 。
同様に、データ型REAL
として定義された列と変数 4バイトのストレージを使用し、-3.40E + 38
の範囲の値を提供します 3.40E + 38
へ 。
SQL文字データ型
データ型CHAR
およびVARCHAR
最大8,000バイトの長さの文字データを格納するために使用されます。これらのデータ型はどちらもデータベース列に文字列値を格納しますが、値の格納方法と取得方法が異なります。 CHAR
の長さ データ型は、その割り当てスペースが使用されているかどうかに関係なく、指定された長さに固定されたままです。スペースが使用されていない場合、列または変数には余分なスペースが埋め込まれます。 VARCHAR
スペースを追加せずに、値をそのまま出力します。
以下の例は、文字データ型を示しています。
-
コマンドラインから、
Employee
を作成します テーブル。CREATE TABLE Employee ( LastName VARCHAR(25), FirstName VARCHAR(20), Sex CHAR(1) );
-
次の値を
Employee
に挿入します テーブル。INSERT INTO Employee (LastName, FirstName, Sex) VALUES ('Jones', 'Mary', 'F');
-
SELECT
を使用して列の値を取得します ステートメント:SELECT LastName, FirstName, Sex FROM Employee;
出力は次のようになります:
+----------+-----------+------+ | LastName | FirstName | Sex | +----------+-----------+------+ | Jones | Mary | F | +----------+-----------+------+
列LastName
およびFirstname
タイプVarchar
と宣言されています 。これにより、名前をデータ型の定義と同じ長さにすることができます。ただし、指定された最大値より短い名前の場合、これらの列のデータに空白は追加されません。
SQLの日付と時刻のデータ型
DATETIME
データ型は、データベースに日付と時刻の値を格納するために使用されます。 DATETIME
の値 データ型は、日付部分に4バイト、時間部分に4バイトのストレージを使用します。このデータ型の時間部分は、深夜0時からのミリ秒数までの粒度で時間を指定します。このデータ型の精度は、「1753年1月1日」から「9999年12月31日」までの範囲で、精度は3.33ミリ秒です。
注 日付値のみを DATETIME
に割り当てる場合 データ型の列または変数の場合、時間部分はデフォルトで深夜になります。
以下の例は、DATETIME
を示しています データ型。
DELIMITER //
CREATE PROCEDURE Datetimedemo()
BEGIN
DECLARE BirthDate DATETIME
SET BirthDate = '1990-01-01 09:00:00'
SELECT BirthDate
END//
DELIMITER ;
call Datetimedemo;
出力は次のようになります。
+----------+-----------+
| BirthDate |
+----------+-----------+
| 1990-01-01 09:00:00 |
+----------+-----------+
注 一部のSQL実装は、上記で指定されたすべてのデータ型のサブセット、スーパーセット、またはバリアントのいずれかである追加のデータ型をサポートします。
SQLデータ型に関する考慮事項
データベースを設計するときは、テーブル列とストアドプロシージャ変数に適切なデータ型を慎重に選択することが非常に重要です。
行った選択は、ストレージ効率とデータベース全体のパフォーマンスに大きな影響を与える可能性があります。簡単な例は、人のAge
を定義することです。 Tinyint
の列 Int
ではなくデータ型 データ・タイプ。これは、次の理由によるものです。
- 前述のように、
Tinyint
データ型には、Int
のストレージ要件の1/4があります データ型。 -
Tinyint
の取得効率 列とInt
列ははるかに大きいです。
表面的には、これは大きな問題ではないように見えるかもしれません。ただし、影響を受けるテーブルに数百万行が含まれている場合は、ストレージとパフォーマンスの両方の効率を確実に達成できます。この設計基準をデータベース全体に拡張すると、これらの効率を桁違いに生み出すことができます。
データベースのデータ型の選択に必要な設計時間を費やすと、さまざまなデータ型の列を比較するときに、クエリやストアドプロシージャロジックで高価な型変換を実行する必要性を軽減できる可能性があります。
たとえば、あるテーブルでは、日付をVarchar(20)
に格納します。 列、および別のテーブルにDatetime
に日付を格納します 桁。 2つの列を比較する必要がある場合は、2つの列のいずれかでクエリでデータ型変換関数を使用する必要があります。これは費用のかかる操作です。
結論
SQLデータ型は、データベースの列と変数に関連付けられた属性です。これらの属性は、バイナリ、数値、文字、および日付/時刻の形式をとることができます。ストレージとクエリの実行効率の両方を確保するために、列と変数が正しいデータ型で定義されていることを確認するには、慎重な設計時間が必要です。