MySQLでUNSIGNEDとSIGNED INTを使用する必要があるのはいつですか?


99

MySQLでUNSIGNEDおよびSIGNED INTを使用する必要があるのはいつですか?何を使うのが良いですか、これは個人的な好みですか?私がそれがこのように使われるのを見たので;

id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT

そして

id INT(11) NOT NULL AUTO_INCREMENT

4
負のPKはあまり意味をなさない
zerkms 12/07/17

回答:


162

UNSIGNED正の数値(またはゼロ)のみを格納します。一方、signedは負の数を格納できます(つまり、負の符号を持つ場合があります)。

以下は、各INTEGERタイプが保存できる値の範囲の表です。

MySQL INTEGERのタイプと長さ
ソース:http : //dev.mysql.com/doc/refman/5.6/en/integer-types.html

UNSIGNEDの範囲は0nで、符号付きの範囲は約-n/2n/2です。

この場合、AUTO_INCREMENTID列があるため、ネガティブはありません。したがって、を使用しますUNSIGNED。列に使用しない場合UNSIGNEDAUTO_INCREMENT可能な最大値は半分になります(値の範囲の負の半分は使用されません)。


14
ただし、これUNSIGNEDはMySQL固有であり、標準のSQL機能ではないことに注意してください。つまり、を使用UNSIGNEDすると、別のRDBMSへの将来の移行がより複雑になったり、SQLAlchemyなどの標準SQLをターゲットとするソフトウェアライブラリを使用するときに問題が発生する可能性があります。これは答えの一部になると思います。
minexew 2018


4

基本的にを使用するとUNSIGNED、負の数は必要ないことを明示的に指定するため(通常、格納する値が負になることはないため)、整数の2倍のスペースを確保できます。


1

vipin cpに同意しません。

真は、最初のビットが符号を表すために使用されることです。ただし、1は負の値、0は正の値を表します。さらに負の値は異なる方法でコード化されます(2の補数)。TINYINTの例:

The sign bit
|
1000 0000b = -128d  
...  
1111 1101b = -3d  
1111 1110b = -2d  
1111 1111b = -1d  

0000 0000b = 0d  
0000 0001b = 1d  
0000 0010b = 2d  
...  
0111 1111b = 127d  


0

私が追加したいことの一つsigned intが、default value in mysql1 bit表現するために使用されますsign-1 for negative and 0 for positive. したがって、アプリケーションで正の値のみを挿入する場合は、符号なしを指定する方が適切です。


0

保存する番号のタイプがわかっている場合は、それに応じて選択できます。この場合、負になることのない「id」を持っています。したがって、unsigned intを使用できます。符号付き整数の範囲:-n / 2から+ n / 2符号なし整数の範囲:0からnしたがって、正の数の2倍の数を利用できます。適宜選択してください。


0

(例:)値を分、時間、または秒の形式でUNSIGNED格納するのに最適なオプションだと思います。これは間違いなく負ではない数値になりますtime_durationresolved_call_time = resolved_time(DateTime)-creation_time(DateTime)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.