Каковы двоичные форматы устройства хранения данных для sqflt8, sqlmoney и других собственных типов данных SQL?

Согласно документации, собственные (двоичные) данные могут быть импортированы или экспортированы с BCP, отформатированной в собственных форматах данных SQL Server. Примерами их является SQLFLT8, SQLFLT4, SQLMONEY или SQLNUMERIC.

Делает любой знает или что форматы данных для различных типов, или где документация, указывающая эти форматы, могла бы быть найдена. Например, SQLFLT8 хранится как число двойной точности IEEE или в некотором другом формате?

Править: Из ответов kevchadders и Andrew I имел немного прозрения, сделал определенный поиск с помощью Google для #define и определение типа, чтобы видеть, мог ли я найти заголовочные файлы C с определениями. Это придумало файл odbcdss.h; ответ, который я отправил ниже, имеет некоторые купюры из файла, который выглядит довольно многообещающим.

8
задан Community 23 May 2017 в 12:03
поделиться

3 ответа

Я не уверен, что теория проведет, но выяснение внутреннего хранения типов может быть достигнута с помощью некоторого SQL и немного выяснения. Я сделал это для нового dateTime2 / dateTimeoffset в моем блоге, чтобы спешифицировать внутренний двоичный формат, поскольку мне было интересно, чтобы увидеть, как они получили дополнительную точность.

В качестве примера для денег

declare @test money
set @test = 12.34
select @test -- shows 12.34 as expected

declare @binaryValue binary(8)
set @binaryvalue = convert(binary(8),@test)
select @binaryvalue 

вывод: 0x000000000001e208

, который составляет 123400, когда он рассматривается как десятичное число, деньги хранятся в 4 десятичных места, чтобы указать 12.3400 в качестве значения, обращаясь к этому теоретической ценностью Всего 1 в шестнадцатеричном должен быть 0,0001

declare @test money
declare @binaryValue binary(8)
set @binaryvalue = 0x0000000000000001
set @test = convert(money,@binaryvalue)
select @test

Выходы 0,0001

Следующая вещь, которую я бы проверил, это отрицательные числа,

declare @test money
set @test = -12.34
select @test -- shows -12.34 as expected

declare @binaryValue binary(8)
set @binaryvalue = convert(binary(8),@test)
select @binaryvalue 

Выход: 0xFFFFFFFFFFFE1DF8

Так что выглядит так, как это подписано 8 байтовых номеров, так как Просто убрал номер от FF ... etc. Быстрая чека с -0.0001 выдает все 0xFFF .... FFF, как и ожидалось, и -0.0002 дает 0xFF .... FFE, как и ожидалось.

Если удерживается ли это для BCP, я не уверен, но в качестве внутреннего формата хранения я бы полагаю на подписанном 8 байтовом целочисленном числе, который имеет принятие 4 десятичных знаков.

5
ответ дан 5 December 2019 в 14:03
поделиться

Некоторые дополнительные густочки для #define и Typedef в сочетании с типовыми типами данных включали этот файл заголовка ( odbcss.h ), связанный здесь . . Первая строка имеет #defines для магических констант, которые соответствуют именам типов данных SQL. Нижний фрагмент имеет некоторые определения типаFS и структуры для разумных форматов видов данных для типов.

Похоже, это могут быть соответствующие определения формата.

Соответствующие фрагменты:

// SQL Server Data Type Tokens. Returned by SQLColAttributes/SQL_CA_SS_COLUMN_SSTYPE.
#define SQLTEXT             0x23
#define SQLVARBINARY        0x25
#define SQLINTN             0x26
#define SQLVARCHAR          0x27
#define SQLBINARY           0x2d
#define SQLIMAGE            0x22
#define SQLCHARACTER        0x2f
#define SQLINT1             0x30
#define SQLBIT              0x32
#define SQLINT2             0x34
#define SQLINT4             0x38
#define SQLMONEY            0x3c
#define SQLDATETIME         0x3d
#define SQLFLT8             0x3e
#define SQLFLTN             0x6d
#define SQLMONEYN           0x6e
#define SQLDATETIMN         0x6f
#define SQLFLT4             0x3b
#define SQLMONEY4           0x7a
#define SQLDATETIM4         0x3a
#define SQLDECIMAL          0x37
#define SQLDECIMALN         0x6a
#define SQLNUMERIC          0x3f
#define SQLNUMERICN         0x6c

[. Отказ Отказ ]

typedef char            DBCHAR;
typedef unsigned char   DBBINARY;
typedef unsigned char   DBTINYINT;
typedef short           DBSMALLINT;
typedef unsigned short  DBUSMALLINT;
typedef long            DBINT;
typedef double          DBFLT8;
typedef unsigned char   DBBIT;
typedef unsigned char   DBBOOL;
typedef float           DBFLT4;

typedef DBFLT4 DBREAL;
typedef UINT   DBUBOOL;

typedef struct dbvarychar
{
    DBSMALLINT  len;
    DBCHAR      str[DBMAXCHAR];
} DBVARYCHAR;

typedef struct dbvarybin
{
    DBSMALLINT  len;
    BYTE        array[DBMAXCHAR];
} DBVARYBIN;

typedef struct dbmoney
{               // Internal representation of MONEY data type
    LONG  mnyhigh;      // Money value *10,000 (High 32 bits/signed)
    ULONG mnylow;       // Money value *10,000 (Low 32 bits/unsigned)
} DBMONEY;

typedef struct dbdatetime
{               // Internal representation of DATETIME data type
    LONG  dtdays;       // No of days since Jan-1-1900 (maybe negative)
    ULONG dttime;       // No. of 300 hundredths of a second since midnight
} DBDATETIME;

typedef struct dbdatetime4
{           // Internal representation of SMALLDATETIME data type
    USHORT numdays;     // No of days since Jan-1-1900
    USHORT nummins;     // No. of minutes since midnight
} DBDATETIM4;

typedef LONG DBMONEY4;  // Internal representation of SMALLMONEY data type
                        // Money value *10,000

#define DBNUM_PREC_TYPE BYTE
#define DBNUM_SCALE_TYPE BYTE
#define DBNUM_VAL_TYPE BYTE
typedef const LPBYTE    LPCBYTE;
typedef DBINT *         LPDBINT;

#if (ODBCVER < 0x0300)
#define MAXNUMERICLEN 16

typedef struct dbnumeric
{                 // Internal representation of NUMERIC data type
    DBNUM_PREC_TYPE   precision; // Precision
    DBNUM_SCALE_TYPE  scale;     // Scale
    BYTE     sign;           // Sign (1 if positive, 0 if negative)
    DBNUM_VAL_TYPE    val[MAXNUMERICLEN];   // Value
} DBNUMERIC;
typedef DBNUMERIC DBDECIMAL;// Internal representation of DECIMAL data type
#else   //  Use ODBC 3.0 definitions since same as DBLib
#define MAXNUMERICLEN SQL_MAX_NUMERIC_LEN
typedef SQL_NUMERIC_STRUCT DBNUMERIC;
typedef SQL_NUMERIC_STRUCT DBDECIMAL;
#endif

#endif //   MAXNUMERICLEN
6
ответ дан 5 December 2019 в 14:03
поделиться

Хороший вопрос.

не кажется многое в Интернете об этом, но я нашел этот родные типы хранения файлов (вторая таблица вниз), который показывает каждый тип хранения файлов и что он записан в соответствующих данных файла хоста. тип.

E.g. float = sqlflt8
Real = SQLFLT4
деньги = sqlmoney
Numeric = SQLNUMERIC

Извинения, если вы уже столкнулись с этим списком.

1
ответ дан 5 December 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: