2016-12-18 2 views
3

SQL Server에서는 FLOAT 또는 REAL을 사용하여 IEEE 754 표준에 정의 된 저장 형식이 지워진 부동 소수점 값을 저장할 수 있습니다. 고정 소수점 값의 경우 DECIMAL 유형 (동의어는 NUMERIC)을 사용할 수 있습니다. 그러나 나는 SQL Server가 DECIMAL 값을 내부적으로 저장하는 방법을 잘 모릅니다. 예를 들어, 나는 테이블을 정의하면 다음과 같은 행을 삽입 :SQL Server는 decimal 형식 값을 내부적으로 어떻게 저장합니까?

01 70 E0 00 00 

이 진수 : SQL 서버 저장 숫자 5.7456, 나는이있어 어떻게

IF OBJECT_ID('dbo.test_number_types') IS NOT NULL DROP TABLE dbo.test_number_types; 
CREATE TABLE dbo.test_number_types 
(
    id INT IDENTITY(1, 1), 
    c1 NUMERIC(5, 4) 
) 
GO 

INSERT INTO dbo.test_number_types(c1)VALUES(5.7456); 

내가 DBCC PAGE 명령을 사용

확인하기 string은 little endian을 사용해야합니다. SQL Server가 5.7456을 01 70 E0 00 00으로 바꾸는 방법과 정수 부분에 대한 바이트 수와 소수 부분에 대한 바이트 수를 결정하는 방법을 이해할 수 없습니다. 누구든지 도와 줄 수 있습니까?


BTW, "SQL Server 2012 Internals"책을 확인했습니다. 데이터 유형 저장 전용 장이 있습니다. 그런데 DECIMAL 유형 저장은 책에서 언급되지 않는다.

+0

힌트 : BCD, 이진화 십진법 (https : //로 갖추고 있습니다. wikipedia.org/wiki/Binary-coded_decimal). 이것이 SQL Server가 실제로 값을 저장하는 방법입니다. 그러나 다른 언어로 고정 소수점 값을 저장하는 것은 매우 일반적인 방법입니다. –

+0

Gordon에게 감사드립니다. 내가 한번 볼게. –

+0

@ GordonLinoff 시도했는데 BCD 인코딩이 아닌 것 같습니다. –

답변

5

마틴 스미스 주석이 단서를 제공합니다. SQL Server는 BCD를 사용하지 않습니다. 소수 자릿수가없는 정수로 데이터를 저장합니다. 소수 자릿수는 열의 메타 데이터에 저장되므로 수행 할 수 있습니다. 따라서 5.745657456 또는 0xE070으로 저장됩니다. SQL의 악명 높은 바이트 스와핑 이후에는 70 E0 00 00으로 변환됩니다.

선도 01은 기호입니다. 01은 양수로 사용됩니다. 음화의 경우 00

(그러나, 나는 요청해야합니다 - 당신이 필요 왜 일반적인 사용에서, 당신은 SQL 서버의 내부 귀찮게 할 필요가 없습니다해야합니까?)

+0

다시 한번 감사드립니다. 휴고! 나는 이것이 "SQL Server 2012 Internals"라는 책을 읽고 있기 때문에 이것을 알고 싶습니다. DECIMAL 유형이 언급되지 않았 음을 발견했습니다. 그냥 호기심. –

관련 문제