14

User-Defined Variables の下で、MySQL マニュアルのドキュメント:

ユーザー変数には、整数、10 進数、浮動小数点、バイナリまたは非バイナリ文字列、またはNULL値など、限られたデータ型のセットから値を割り当てることができます。10 進数値と実数値の代入では、値の精度や位取りは保持されません。許容される型以外の型の値は、許容される型に変換されます。たとえば、時間データ型または空間データ型を持つ値は、バイナリ文字列に変換されます。

ユーザー変数に非バイナリ (文字) 文字列値が割り当てられている場合、その文字セットと照合順序は文字列と同じです。ユーザー変数の強制力は暗黙的です。(これは、テーブルの列の値と同じ強制力です。)

ただし、マニュアルには次のように記載されていません。

  • サポートされている整数のサイズ(例: 4-byteINTまたは 8-byte BIGINT)、それらが符号付きか符号なしか、およびZEROFILL適用されるかどうか (そうであれば、どの表示幅を使用するか);

    この sqlfiddle 、MySQL 5.5.25 が まで使用しBIGINT、割り当てに従って署名され、 を適用しないことを示唆しているようZEROFILLです。

  • 固定小数点値と浮動小数点値で使用される精度と位取り。これは代入から保持されません。と

  • 文字列の最大長 (文字数および/またはバイト数)。

    sqlfiddle はmax_allowed_packet2 20バイトに制限されています (これは変更できません): 2 32バイト (4GiB) がサポートされていると思います。LONGTEXT

特にサーバーのバージョンや構成が異なる場合に、安全に信頼できる制限は何ですか?

4

1 に答える 1

6

ユーザー変数は、MySQL が列値の計算に使用するのと同じ内部データ型を使用します。これらの内部型は、MySQL がサポートするすべてのデータ型に対して十分な大きさです。

  • 整数には がありませんZEROFILL。これは、データ型自体ではなく、列の追加のプロパティであるためです。さらに、整数のユーザー変数には幅がありません。テキストに変換すると、必要なだけの桁数が使用されます。
  • 浮動小数点値には位取りがありません。64 ビットの IEEE 浮動小数点数はバイナリ値であり、10 進数で約 18 桁の精度があります。
  • 理論的には、十分な大きさで十分なメモリがあるLONGTEXT場合、文字列は任意の値を保持する必要があります。ただし、バグ 31898max_allowed_packetで言及されているように、ユーザー変数には文書化されていない 16 MB の制限があります。
于 2012-10-17T21:38:20.793 に答える