Mysql

MariaDB CONNECT 引擎 BIN 表 - 文件記錄佈局、日期數據類型的儲存、填充

  • July 6, 2019

在 Windows 10 上執行的 mariadb-10.4.5 中,我創建了這個表(在本地數據庫中):

`CREATE TABLE IF NOT EXISTS `testbalNoFieldFormat` (
 `fig` int(4) NOT NULL,
 `name` char(10) NOT NULL,
 `birth` date NOT NULL,
 `id` char(5) NOT NULL,
 `salary` double(9,2) NOT NULL DEFAULT 0.00,
 `dept` int(4) NOT NULL
) ENGINE=CONNECT DEFAULT CHARSET=utf8 `table_type`=BIN `block_size`=5 `file_name`='TestbalNoFieldFormat.dat'

INSERT INTO testbalNoFieldFormat VALUES(1,"1234567890",'2009-01-20','abcde',100000.12,1234)

我從https://www.proxoft.com/BinaryViewer.aspx檢查了 Binary Viewer 中的文件。

在二進制查看器中(用雙引號括起來,以便您可以看到開始和結束):

將單個字節視為無符號整數,而不是八進制:

"   1   0   0   0   49  50  51  52  53  54  55  56  57  48  32  32
   32  32  32  32  32  32  32  32  32  32  32  32  32  32  32  32
   32  32  48  93  116 73  97  98  99  100 101 32  32  32  32  32
   32  32  32  32  32  184 30  133 235 1   106 248 64  210 4   0
   0"

作為ASCII,它是:

"   .   .   .   .   1   2   3   4   5   6   7   8   9   0        

           0   ]   t   I   a   b   c   d   e                    
                       ?   .   ?   ?   .   j   ?   @   ?   .   .
   ."

分組為 4 字節整數(Little Endian),字節為:

"   1           875770417   943142453   538980409
   538976288   538976288   538976288   538976288
   1563435040  1650542964  543515747   538976288
   538976288   2233382944  4167696875  315968
   538976256"

我可以看到我插入的第一個 int 值(第一個欄位,值 1),但看不到我插入的第二個 int 值(最後一個欄位,值 1234)。可能有一些填充會影響事物,但 65 字節似乎是一個奇數,我認為它會填充到 8 個字節或 4 個字節的倍數。

文件長度為 65 字節,而上一張表 (testbal) 為 46 字節。

任何人都可以為我解釋字節結構嗎?具體來說,哪些字節代表欄位 3(出生)、5(工資)、6(整數)?

哪些字節代表填充?

如何從表示日期欄位“出生”值的字節中提取年、月和日?

1   0   0   0  -- 1; note "little-endian"
49  50  51  52  53  54  55  56  57  48  -- ascii/utf8 for "1234567890"
32  32  32  32  32  32  32  32  32  32
32  32  32  32  32  32  32  32  32  32 -- lots of spaces for padding
48  93  116 73   -- must be the date?
97  98  99  100 101   -- ascii/utf8 for 'abcde'
32  32  32  32  32
32  32  32  32  32   -- lots of spaces for padding
184 30  133 235 1   106 248 64  -- 100000.12 --> hex: 40 f8 6a 01 eb 85 1e b8
210 4   0   0  -- 1234 = 210 + 4*2^8 + 0 * 2^16 + 0 * 2*24

在 上INT(4)(4)沒有意義(除非你也使用ZEROFILL)。 INT總是 4 字節,但不是因為(4).

DOUBLE始終為 8 個字節;(m,n)不應該使用。

空格被填充CHAR(n) CHARACTER SET utf8到每個字元3**個字節。這是幾乎總是使用,而不是的論據。VARCHAR``CHAR

utf8mb4會有更多的間距。

引用自:https://dba.stackexchange.com/questions/242240