上位のデータベースプラットフォームで符号なし整数型が利用できないのはなぜですか?


15

データベースは通常、さまざまなデータ型とカスタムの長さで非常にカスタマイズ可能です。

unsigned intPostgreSQLとMS SQL Serverのどちらからも利用できない型を使用する構文を探しているので、私は驚きました。MySQLとOracleのようです。

これは明白な省略のように見えます-次に最適なパフォーマンスオプションはlong / bigint(8バイト整数)ですが、完全に不要な場合があります!ネイティブのunsigned intサポートを含めないことを選択する理由を誰もが知っていますか?


2
ポータブル==標準必須。C標準では、通常のintやlongの幅は指定せず、表現可能な数値の最小範囲のみを指定しています。16ビット整数を持つプラットフォームは、ある時点で一般的でした。64ビットが可能です。36も(絶滅した​​が)。24が発生します(DSP)。それはあなたが32ビットに収まるデータを持っているがない31、という方法が多いですし、あなたが通常の数値型を使用すると、あなたのパフォーマンスに影響を与えることを測定したこと?
マット

2
どちらもSQL-ServerとPostgresはありNUMERIC(10)までの整数までのことができます9.999.999.999(あなたが負の値を禁止することができ、制約付き。)
ypercubeᵀᴹ

4
1つの理由:標準SQLで指定されていません。Postgresに関するより長い議論については、この議論を見てください:postgresql.1045698.n5.nabble.com/…そしてこれ:postgresql.1045698.n5.nabble.com/…–
a_horse_with_no_name


1
@Mat私が心配しているパフォーマンスヒットではなく、4バイト余分に1億5,300万=約612 MBの無駄があり、値は30億を超えていますが、40億ではありません。numeric(10)には、9バイトのストレージが必要であることに加えて、パフォーマンスヒットがあります:msdn.microsoft.com/en-us/library/ms187746.aspx
Ehryk

回答:


14

MicrosoftのJim Hoggは、この問題に次のように対応しています。

長所と短所があります。プロ側では、いくつかのエラーを回避する良い方法のように思えます-(符号付き)intの値が0より大きいことを確認する必要があります。また、実際には、int 。最大行数を2倍にする問題について -本当ですが、これはそれほど説得力がないと思います。

短所としては... CまたはC ++で符号付き/符号なしの型を混在させることは、十分に単純であるように思われます。そうではありません。これは、見つけにくいミスの小さなターピットを開きます。これは、暗黙的なプロモーション/拡大のための複雑なルールによるものです。悲しいかな、SQLにはすでに暗黙のキャストルールのさらに複雑なセットがあります。署名されていないintを追加すると、私たちはさらに混乱するでしょう。

私は本でこの提案を続けます。ただし、追加する/追加する必要のあるすべての機能の中で、この機能は、そのリストの最上位にありません。

ソース:Microsoft Connect

私はプロリストに大幅に追加し、彼らのSQLエンジンがすでにこれよりもはるかに複雑なことを行っているので、彼らのチームが追加された複雑さを処理できることを繰り返します。それらの合計には同意しませんが、これがSQL Serverが符号なしの型をサポートしない理由です。

Connectリンクは、元々Martin Smithが質問のコメントに投稿したものです。


3
「さらに混乱させてください」-おそらく、自分の開発チームだけでなく、SQL Serverを使用しているすべての人を指します。
オスカーバーググレン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.