sqflt8、sqlmoney、およびその他のネイティブ SQL データ型のバイナリ ストレージ形式は何ですか?

StackOverflow https://stackoverflow.com/questions/2099919

  •  21-09-2019
  •  | 
  •  

質問

ドキュメントによると、ネイティブ (バイナリ) データは、ネイティブ SQL Server データ形式でフォーマットされた bcp を使用してインポートまたはエクスポートできます。これらの例としては、SQLFLT8、SQLFLT4、SQLMONEY、または SQLNUMERIC があります。

さまざまなタイプのデータ形式が何であるか、またはこれらの形式を指定するドキュメントがどこにあるかを知っている人はいますか。たとえば、SQLFLT8 は IEEE 倍精度数値として保存されますか、それとも他の形式で保存されますか?

編集: さんの回答から ケブチャダース そして アンドリュー 私は少しひらめき、#define と typedef について少しグーグル検索して、定義を含む C ヘッダー ファイルを見つけることができるかどうかを確認しました。これはファイルを思いつきました odbcdss.h;の 答え 以下にファイルからの抜粋を掲載しましたが、これは非常に期待できそうです。

役に立ちましたか?

解決

私は理論が保持するかどうかわからないんだけど、種類の内部ストレージは、いくつかのSQLと考え出すのビットを使用して達成することができる見つけます。私は、彼らは追加の精度を得た方法を見て興味があったとしてspeifically内部バイナリフォーマットを取得するために私のブログに新しい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桁まで格納されているが、理論的にはちょうど1ヘキサン中の値を、これを逆転させる、値として12.3400を示すことになるようでなければなりません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 ...からの数を取るているので。 -0.0001でのクイックチェックは、予想通り、すべての0xFFF .... FFFを与え、-0.0002は0xFFのを与える....予想通りFFEます。

これはBCP私のために保持しているかどうかはわからないが、内部ストレージフォーマットとして私は、小数点以下4桁を想定した符号付き8バイトの整数で推測を取るだろう。

他のヒント

データ型と組み合わせて #define と typedef をさらに検索すると、このヘッダー ファイルが見つかりました (odbcss.h) リンクされています ここ。. 。最初の行には、SQL データ型の名前に直接対応するマジック定数の #Defines があります。下のスニペットには、型の適切に見えるデータ形式の typefs と構造体の定義がいくつかあります。

これらは関連する形式定義である可能性があるようです。

関連するスニペットは次のとおりです。

// 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

グッド質問ます。

はこのことについてウェブ上であまり見えませんが、私はこの先住民ましたそれぞれのネイティブファイル記憶タイプを示し、それは、対応するホストファイルデータ型に記録されているもののファイルストレージ・タイプの(第2のテーブルダウン)。

例えば。 フロート= SQLFLT8
本物= SQLFLT4
お金=
たSqlMoney 数値= SQLNUMERIC

申し訳ないあなたは既にこのリストに遭遇した場合。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top