2009-10-02 7 views
7

誰も私は8バイトとbigintを使用する代わりに4バイトを使用して、符号なし整数(0から4294967295)を保存できる任意の回避策を知っていますか?SQLサーバーの4バイトの符号なしint

私は、ユーザー定義のデータ型を作成し、負の値を許可しないように制約を作成できますが、2147483647以上の値を入力することはできません。4バイトしか使用しませんが、整数値より大きく2147483647未満4294967295

可能な重複: 4 byte unsigned int in SQL Server?

+0

データ型は、SQL Serverのあなたは、MSSQLを使用している..実装から実装に公平なビットを変えますか? mysql? – whatnick

+0

"sql-server"タグはMircosoft SQL Server用です。 – RBarryYoung

+0

m SQL Server 2008を使用しています:-) thats sql-serverというタグを付けた理由 – Raj

答えて

3

あなたがUDTを使用して作成、またはより大きなデータタイプを選ぶことができるようにあなたに利用可能な符号なしの型は、ありません。あなたがUDTでそれを行うなら、あなたは再び4バイトを越えるでしょう。

極端なハックは、-2^31を追加することで、保存した値に自動的にオフセットを適用することですが、これは実際にコードを見ている人にとって混乱を招く本当のハックな方法です。間違いや物事が見逃される可能性について言及しています。私はハックをまったくお勧めしません。

0

この解決方法は少し混乱するかもしれませんが、あなたの目的のために動作します。 2^31-1より大きい値を整数として格納すると、オーバーフローが発生し、負の数として表示されます。値を整数として保存し、コードで再解釈することもできます。

+1

オーバーフローの動作は定義されていますか?または実装によって異なりますか? – Pacerier

2

バイナリ(4)を使用してください。あなたが望むなら、それをUDTで包みなさい。

+5

これは実際には6バイトを使用します。バイナリデータタイプのオーバーヘッドは4データバイト+ 2バイトです。 –

+0

なぜなら、オーバーロードは、 'uint16'の' binary(2) 'の代わりに 'int'をチェック制約で使う理由です。また、バイナリ(x)の格納形式でエンディアンを考慮する必要があるかもしれません。 –

+0

@JeffMeatballYangいいえ、 'varbinary'は2バイトのオーバーヘッドを持ち、' ​​binary'は何も持っていません。こちらをご覧ください:http://www.smattie.com/2013/01/14/sql-server-data-types/(また、申し訳ありませんが、何とか3年前にあなたのコメントがありませんでした) – RBarryYoung

0

RBarryで述べたように、これを使用してみてくださいは:

declare @bi binary(4) = cast(2147483648 as bigint) 

declare @i int = cast(@bi as binary(4)) 

select @i 

declare @bi2 bigint = cast(cast(@i as binary(4)) as bigint) 

select @bi2 
関連する問題