Mysql
MariaDB CONNECT 引擎 BIN 表 - 文件記錄佈局、日期數據類型的儲存、填充
在 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
會有更多的間距。