MySQL
データ型
サーチ…
暗黙的/自動鋳造
select '123' * 2;
2
乗算するために、MySQLは自動的に文字列123
を数値に変換します。
戻り値:
246
数字への変換は、左から右に始まります。変換が不可能な場合、結果は0
select '123ABC' * 2
戻り値:
246
select 'ABC123' * 2
戻り値:
0
VARCHAR(255) - そうでないか
推奨される最大len
最初に、常に16進数であるか、あるいはASCIIに制限されているいくつかの一般的な文字列について説明します。これらのために、スペースを無駄にしないようにCHARACTER SET ascii
( latin1
は大丈夫です)を指定する必要があります:
UUID CHAR(36) CHARACTER SET ascii -- or pack into BINARY(16)
country_code CHAR(2) CHARACTER SET ascii
ip_address CHAR(39) CHARACTER SET ascii -- or pack into BINARY(16)
phone VARCHAR(20) CHARACTER SET ascii -- probably enough to handle extension
postal_code VARCHAR(20) CHARACTER SET ascii -- (not 'zip_code') (don't know the max
city VARCHAR(100) -- This Russian town needs 91:
Poselok Uchebnogo Khozyaystva Srednego Professionalno-Tekhnicheskoye Uchilishche Nomer Odin
country VARCHAR(50) -- probably enough
name VARCHAR(64) -- probably adequate; more than some government agencies allow
単純に255ではないのはなぜですか?すべてに(255)を使用する一般的なプラクティスを避ける2つの理由があります。
- 複雑な
SELECT
が(サブクエリ、UNION
、GROUP BY
などの)一時テーブルを作成する必要がある場合は、MEMORY
エンジンを使用してデータをRAMに格納することをお勧めします。しかし、VARCHARs
はプロセス中でCHAR
に変換されます。これにより、VARCHAR(255) CHARACTER SET utf8mb4
は1020バイトになります。これはディスクに流出する必要がありますが、遅くなります。 - ある状況では、InnoDBはテーブル内のカラムの潜在的なサイズを調べ、それが大きすぎると判断して
CREATE TABLE
打ち切ります。
VARCHARとTEXT
*TEXT
、 CHAR
、およびVARCHAR
使用ヒントに加えて、いくつかのベスト・プラクティス:
-
TINYTEXT
決して使用しないでください。 -
CHAR
ほとんど使用しない - 固定長です。各文字はCHARACTER SET
最大長(例えば、utf8mb4の場合は4バイト/文字)です。 -
CHAR
では、他に分かっていない限り、CHARACTER SET ascii
使用してください。 -
VARCHAR(n)
はn 文字で切り捨てられます。TEXT
は、いくつかのバイト数で切り捨てられます 。 (しかし、切り捨てが必要ですか?) -
*TEXT
は、SELECTs
テーブルの扱い方によって複雑なSELECTs
遅くすることがあります。
AUTO_INCREMENTとしてのINT
AUTO_INCREMENT
は、 INT
任意のサイズを使用できます。 UNSIGNED
は常に適切です。
特定の操作によってAUTO_INCREMENT
IDが「焼き付けられる」 AUTO_INCREMENT
注意してください。これは予想外のギャップにつながる可能性があります。例: INSERT IGNORE
およびREPLACE
。それらは必要ではないことを認識する前に IDを事前に割り当てるかもしれません。これは、InnoDBエンジンで予想される動作であり、意図的に使用されており、使用を妨げるものではありません。
その他
既に "FLOAT、DOUBLE、DECIMAL"と "ENUM"のエントリが別にあります。データ型に関する単一のページは扱いにくいものです - 私は「フィールド型」(またはそれを「データ型」と呼ぶべきですか?)を概観し、次にこれらのトピックページに分割することをお勧めします:
- INTs
- FLOAT、DOUBLE、およびDECIMAL
- 文字列(CHAR、TEXTなど)
- バイナリとBLOB
- DATETIME、TIMESTAMP、およびフレンド
- ENUMとSET
- 空間データ
- JSONタイプ (MySQL 5.7.8以上)
- 既存のデータ型にshoehorningを必要とするMoneyやその他の一般的な型を表現する方法
適切な場合、各トピックページには、構文や例に加えて、次のものを含める必要があります。
- 変更時の考慮事項
- サイズ(バイト)
- 非MySQLエンジンと対比(優先度は低い)
- PRIMARY KEYまたは2次キーでデータ型を使用する場合の考慮事項
- その他のベストプラクティス
- その他のパフォーマンスの問題
(私の提案が満足または拒否されたときに、この「例」が自己解散すると仮定します)。
はじめに(数値)
MySQLはさまざまな数値型を提供しています。これらは、
グループ | タイプ |
---|---|
整数型 | INTEGER 、 INT 、 SMALLINT 、 TINYINT 、 MEDIUMINT 、 BIGINT |
固定小数点型 | DECIMAL 、 NUMERIC |
浮動小数点型 | FLOAT 、 DOUBLE |
ビット値タイプ | BIT |
整数型
最小符号なしの値は常に0です。
タイプ | ストレージ (バイト) | 最小値 (署名された) | 最大値 (署名された) | 最大値 (符号なし) |
---|---|---|---|---|
TINYINT | 1 | -2 7 -128 | 2 7 -1 127 | 2 8 -1 255 |
SMALLINT | 2 | -2 15 -32,768 | 2 15 -1 32,767 | 2 16 -1 65,535 |
MEDIUMINT | 3 | -2 23 -8,388,608 | 2 23 -1 8,388,607 | 2 24 -1 16,777,215 |
INT | 4 | -2 31 -2,147,483,648 | 2 31 -1 2,147,483,647 | 2 32 -1 4,294,967,295 |
BIGINT | 8 | -2 63 -9,223,372,036,854,775,808 | 2 63 -1 9,223,372,036,854,775,807 | 2 64 -1 18,446,744,073,709,551,615 |
固定小数点型
MySQLのDECIMAL
型とNUMERIC
型は、正確な数値データ値を格納します。これらの型を使用して、金額など正確な精度を保持することをお勧めします。
小数
これらの値はバイナリ形式で格納されます。列宣言では、精度と位取りを指定する必要があります
Precisionは、値として格納される有効桁数を表します。
Scaleは、小数点以下に格納された桁数を表します。
salary DECIMAL(5,2)
5はprecision
を表し、2はscale
表します。この例では、この列に格納できる値の範囲は-999.99 to 999.99
scaleパラメータを省略すると、デフォルトは0になります。
このデータ型は、最大65桁まで格納できます。
DECIMAL(M,N)
がとるバイト数はおよそ M/2
です。
浮動小数点型
FLOAT
とDOUBLE
はおおよそのデータ型を表します。
タイプ | ストレージ | 精度 | 範囲 |
---|---|---|---|
浮く | 4バイト | 23個の有効ビット/〜7個の10進数 | 10 ^ + / - 38 |
ダブル | 8バイト | 53の有効ビット/ 16桁の10進数 | 10 ^ + / - 308 |
REAL
はFLOAT
同義語です。 DOUBLE PRECISION
同義語ですDOUBLE
。
MySQLは(M、D)修飾子も許可しますが、それを使用しないでください。 (M、D)は、値をM桁まで格納できることを意味します.Dは小数点以下にすることができます。 数字は2回丸められるか切り捨てられます。これは利益よりも多くの問題を引き起こすでしょう。
浮動小数点値は近似値であり正確な値として格納されないため、比較で正確に扱うと問題が発生する可能性があります。特に、 FLOAT
値はDOUBLE
値とほとんど同じではないことに注意してください。
ビット値タイプ
BIT
型は、ビットフィールド値を格納するのに便利です。 BIT(M)
は、Mが1 to 64
範囲にあるMビット値までの記憶を可能にする
値をbit value
表記で指定することもできます。
b'111' -> 7
b'10000000' -> 128
時には、128ビットに対して(1 << 7)
ように、単一ビットの値を構成するために 'shift'を使用すると便利なことがあります。
NDB
テーブル内のすべてのBITカラムの最大合計サイズは4096です。
CHAR(n)
CHAR(n)
はn
文字の 固定長の文字列です。それがCHARACTER SET utf8mb4
場合、その文字列に関係なく、正確に4*n
バイトを占めることを意味します。
CHAR(n)
ほとんどの使用例は、英字を含む文字列を含んでいるため、 CHARACTER SET ascii
なければなりません。 ( latin1
はlatin1
です。)
country_code CHAR(2) CHARACTER SET ascii,
postal_code CHAR(6) CHARACTER SET ascii,
uuid CHAR(39) CHARACTER SET ascii, -- more discussion elsewhere
DATE、DATETIME、TIMESTAMP、YEAR、およびTIME
DATE
データ型には日付が含まれますが、時間コンポーネントは含まれません。形式は'YYYY-MM-DD'
で、範囲は '1000-01-01'〜 '9999-12-31'です。
DATETIME
型には、 'YYYY-MM-DD HH:MM:SS'という形式の時刻が含まれます。 '1000-01-01 00:00:00'から '9999-12-31 23:59:59'の範囲です。
TIMESTAMP
型は、 '1970-01-01 00:00:01' UTCから '2038-01-19 03:14:07' UTCまでの有効範囲を持つ日付と時刻を含む整数型です。
YEAR
型は、年を表し、1901〜2155の範囲を保持します。
TIME
型は 'HH:MM:SS'という形式の時刻を表し、 '-838:59:59'から '838:59:59'までの範囲を保持します。
ストレージ要件:
|-----------|--------------------|----------------------------------------|
| Data Type | Before MySQL 5.6.4 | as of MySQL 5.6.4 |
|-----------|--------------------|----------------------------------------|
| YEAR | 1 byte | 1 byte |
| DATE | 3 bytes | 3 bytes |
| TIME | 3 bytes | 3 bytes + fractional seconds storage |
| DATETIME | 8 bytes | 5 bytes + fractional seconds storage |
| TIMESTAMP | 4 bytes | 4 bytes + fractional seconds storage |
|-----------|--------------------|----------------------------------------|
分数秒(バージョン5.6.4以降):
|------------------------------|------------------|
| Fractional Seconds Precision | Storage Required |
|------------------------------|------------------|
| 0 | 0 bytes |
| 1,2 | 1 byte |
| 3,4 | 2 byte |
| 5,6 | 3 byte |
|------------------------------|------------------|
MySQLのマニュアルページのDATE、DATETIME、およびTIMESTAMPの型 、 データ型のストレージ要件 、および時間の秒数の秒数を参照してください。