SQL Serverが符号なしデータ型をサポートしないのはなぜですか?


83

私は特に無署名について考えていintます。

これが実際的な例です:あなたのアイデンティティ列が最大になったらあなたは何をしますか?それは行くことのどちらかが可能ですBigInt(代わりに4の記憶バイト8)または負の整数をサポートするためのアプリケーションをリファクタリングする、とに示されているようにも独自のルールを作成するには、この答え。これらのオプションはどちらも最適ではありません。

UInt 理想的なソリューションですが、SQL Serverはそれを提供していません(MySQLが提供している場合)。

符号なしデータ型はSQL標準(SQL-2003)の一部ではないことを理解していますが、それでも私には無駄に思えます。

これらを(SQL Serverまたは標準に)含めない理由は何ですか?


11
また..... SQL Serverのデザインチームを確認する:あなたは本当につもり最大外にも2INT IDENTITY値?? 本当に?!?!?!あなたはどんなの20億の以上の行を持っている場合、それはあなたが......、私はあなたには、いくつかのディスクスペースを割くとIDENTITYとしてBIGINTを使用することができます賭けるとしている取引である
marc_s

6
marc_sとはどういう意味ですか?それは50年連続で800msごとの挿入だけです、あなたのテーブルはそのような活動をしていませんか?:)
マイクM.

21
@Mike M:私たち全員がミッキーマウスアプリに取り組んでいるわけではありません... 2年以内に30億以上のbigintを使用しました。ピークは> 2000行/秒です。
gbn 2010

5
@gbn私は誰もその負荷を持っていなかったことを意味するつもりはありませんでした。ただし、前述のように、1秒あたりの行数が2000を超える場合、2Bを追加しても問題は解決しません。
マイクM.

9
@Mike Mと@ marc_s、20億行のテーブルがあるシステムで作業していた場合、無駄なストレージに注意を払う可能性があります。インデックスページのサイズとインデックススキャンのパフォーマンスに注意を払う場合があります。そんな中、スペースを無駄にしたくない。
Romhein 2010

回答:


64

推測しなければならないのですが、彼らはタイプの急増を避けようとしていると言えます。一般的に言って、符号なし整数ができることは、符号付き整数ができないことは何もありません。2147483648から4294967296までの数値が必要な場合は、最終的には4294967296を超えるため、おそらく8バイト整数にする必要があります。


3
これが、この質問に対する答えに最も近いと思います。ありがとう。
Romhein 2011

8
「タイプの急増」がスペース/お金を節約できたとしたら、なぜこれが悪だったと思いますか。
サミュエル

1
ORDER BY ABS(Id)特に列がクラスター化された主キーである場合、値による行のフェッチも遅くなります(つまり)。たとえば、32ビットのUNIXタイムスタンプを使用すると、標準のSQL日時から4バイトを削減できる便利な方法になることがよくあります。
Groo 2014年

52

そのために、シード値として-2,147,483,648を使用できます。

Identity(-2147483648, 1)

46

Microsoft Office DevCenterで同様の質問を見つけました

Jim Hogg(プログラムマネージャー)からの返信には、unsignedintを追加するための賛否両論があります。主な欠点は、暗黙の型変換を実装するためのルールが正しくなるための悪夢になることです。

リクエストは「修正されません」としてクローズされました。


リンクが機能しなくなったため、元の回答を読むことができません。しかし、問題はそれが悪夢であるということではないと私は信じています。それはそれを行う方法を言う基準がないということです。たとえば、MySQLが行うことを実行できますが(他のDBMSがUNSIGNEDをサポートしているとは思わない)、別のDBMSが符号のサポートを追加する場合、異なるルールを使用できます。変換設計は重要な問題です。JavaScriptは、真剣に受け止められていない場合に起こることの例です。
フェデリコ・ラッツォーリ

リンクを更新-MSSNOffice DevelopersForumに関するJimHoggのコメント。
アンソニーK

1

これらは標準ではないため、SIGNEDおよびUNSIGNEDキーワードをサポートしていません。SQL標準では、すべての数値タイプが署名されています。

UNSIGNED(およびデフォルトのSIGNED)は、MySQLの拡張機能であり、より高い符号なしの数値を同じバイト数で格納し、負の数を禁止するのに役立ちます。

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