web-dev-qa-db-ja.com

SQL ServerのDECIMALとNUMERICに違いはありますか?

SQL ServerのDECIMALデータ型とNUMERICデータ型に違いはありますか?

いつDECIMALを使用し、NUMERICを使用する必要がありますか?

122
Dhana

それらは同じです。数値は機能的には10進数と同等です。

MSDN: 10進数と数値

101
Guffa

これは、SQL2003標準(§6.1データ型)が2つについて述べていることです。

 <exact numeric type> ::=
    NUMERIC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  | DECIMAL [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  | DEC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  | SMALLINT
  | INTEGER
  | INT
  | BIGINT

 ...

21) NUMERIC specifies the data type
    exact numeric, with the decimal
    precision and scale specified by the
    <precision> and <scale>.

22) DECIMAL specifies the data type
    exact numeric, with the decimal scale
    specified by the <scale> and the
    implementation-defined decimal
    precision equal to or greater than the
    value of the specified <precision>.
40
Joakim Backman

私の知る限り、NUMERICデータ型とDECIMALデータ型に違いはありません。これらは互いに同義であり、いずれかを使用できます。 DECIMALおよびNUMERICデータ型は、固定の精度とスケールを持つ数値データ型です。

編集:

少数の同僚と話すと、おそらくDECIMALがANSI SQL標準であり、NUMERICがプログラミング言語でより一般的に見られるMircosoftが好むものと関係があるかもしれません。 ...多分 ;)

11
kevchadders

Joakim Backmanの答えは具体的ですが、これによりさらに明確になる場合があります。

わずかな違いがあります。 SQL For Dummies、第8版(2013)によると:

DECIMALデータ型はNUMERICに似ています。 ...違いは、実装が指定した値よりも高い精度を指定する可能性があることです。その場合、実装はより高い精度を使用します。精度またはスケールを指定しない場合、NUMERICタイプと同様に、実装はデフォルト値を使用します。

some SQLの実装の違いはデータの整合性にあるようです。 DECIMALは、NUMERICができないように、いくつかのシステムデフォルトに基づいて定義されたものからのオーバーフローを許可します。

1
Alex Firsov

それらは実際には同等ですが、独立したタイプであり、技術的にはROWVERSIONやTIMESTAMPなどの同義語ではありません。ただし、ドキュメントでは同義語と呼ばれていました。これは同義語のわずかに異なる意味です(たとえば、名前以外は区別できません。一方が他方のエイリアスではありません)。皮肉ですよね?

私がMSDNの文言から解釈するのは、実際には次のとおりです:これらのタイプは同一で、名前が異なるだけです。

Type_idの値を除き、ここにあるものはすべて同じです。

SELECT * FROM sys.types WHERE name IN (N'numeric', N'decimal');

この2つの動作の違いについてはまったく知りません。SQLServer 6.5に戻ると、常に100%交換可能として扱ってきました。

for DECIMAL(18,2) and NUMERIC(18,2)? Assigning one to the other is technically a "conversion"?

明示的に行う場合のみ。これを簡単に証明するには、テーブルを作成してから、明示的または-予想される-暗黙的な変換を実行するクエリのクエリプランを調べます。以下に簡単な表を示します。

    CREATE TABLE [dbo].[NumDec]
(
    [num] [numeric](18, 0) NULL,
    [dec] [decimal](18, 0) NULL
);

次に、これらのクエリを実行し、計画をキャプチャします。

DECLARE @num NUMERIC(18,0);
DECLARE @dec DECIMAL(18,0);

    SELECT 
      CONVERT(DECIMAL(18,0), [num]), -- conversion
      CONVERT(NUMERIC(18,0), [dec])  -- conversion
    FROM dbo.NumDec
    UNION ALL SELECT [num],[dec] 
      FROM dbo.NumDec WHERE [num] = @dec  -- no conversion
    UNION ALL SELECT [num],[dec] 
      FROM dbo.NumDec WHERE [dec] = @num; -- no conversion

私たちはそれらを要求した明示的な変換はありますが、期待したような明示的な変換はありません。オプティマイザーはそれらを交換可能として扱っているようです。詳細については、リンクをご覧ください Decimal And Numeric

個人的には、より正確で記述的であるという理由だけでDECIMALという用語を使用することを好みます。 BITも「数値」です。

0
Coder Girl

これらは同義語であり、まったく違いはありません。10進数および数値データ型は、固定精度およびスケールの数値データ型です。

-- Initialize a variable, give it a data type and an initial value

declare @myvar as decimal(18,8) or numeric(18,8)----- 9 bytes needed

-- Increse that the vaue by 1

set @myvar = 123456.7

--Retrieve that value

select @myvar as myVariable
0
Raman Grewal