サーチ…


暗黙的/自動鋳造

select '123' * 2;

2 乗算するために、MySQLは自動的に文字列123を数値に変換します。

戻り値:

246

数字への変換は、左から右に始まります。変換が不可能な場合、結果は0

select '123ABC' * 2

戻り値:

246

select 'ABC123' * 2

戻り値:

0

VARCHAR(255) - そうでないか

推奨される最大len

最初に、常に16進数であるか、あるいはASCIIに制限されているいくつかの一般的な文字列について説明します。これらのために、スペースを無駄にしないようにCHARACTER SET asciilatin1は大丈夫です)を指定する必要があります:

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が(サブクエリ、 UNIONGROUP BYなどの)一時テーブルを作成する必要がある場合は、 MEMORYエンジンを使用してデータをRAMに格納することをお勧めします。しかし、 VARCHARsはプロセス中でCHARに変換されます。これにより、 VARCHAR(255) CHARACTER SET utf8mb4は1020バイトになります。これはディスクに流出する必要がありますが、遅くなります。
  • ある状況では、InnoDBはテーブル内のカラムの潜在的なサイズを調べ、それが大きすぎると判断してCREATE TABLE打ち切ります。

VARCHARTEXT

*TEXTCHAR 、および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はさまざまな数値型を提供しています。これらは、

グループタイプ
整数型 INTEGERINTSMALLINTTINYINTMEDIUMINTBIGINT
固定小数点型 DECIMALNUMERIC
浮動小数点型 FLOATDOUBLE
ビット値タイプ 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です。

浮動小数点型

FLOATDOUBLEおおよそのデータ型を表します。

タイプストレージ精度範囲
浮く 4バイト 23個の有効ビット/〜7個の10進数 10 ^ + / - 38
ダブル 8バイト 53の有効ビット/ 16桁の10進数 10 ^ + / - 308

REALFLOAT同義語です。 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なければなりません。 ( latin1latin1です。)

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の型データ型のストレージ要件 、および時間の秒数の秒数を参照してください。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow