亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

解剖SQLSERVER 第五篇 OrcaMDF里讀取Bits類型數據(譯)

2024-07-21 02:48:58
字體:
來源:轉載
供稿:網友
解剖SQLSERVER 第五篇 OrcaMDF里讀取Bits類型數據(譯)解剖SQLSERVER 第五篇 OrcaMDF里讀取Bits類型數據(譯)

http://imPRove.dk/reading-bits-in-orcamdf/

Bits類型的存儲跟SQLSERVER其他定長數據類型的存儲很不一樣。通常,所有定長列都會顯示出來,一個條記錄里定長數據部分的字段數據總是一個挨著一個

我們可以寫入磁盤的最小數據單位是一個字節,存儲位類型數據的天真的方法就是使用一整個(字節@)來存儲每一個位,使用常用的格式去解釋位類型數據是很簡單的

,不過這會浪費一些空間 ,就像null位圖,如果一個表只有3列,那么用一個字節來存儲null位圖會比較浪費,因為其他的5個位都沒有用到

@:文章里是用位 ,這里應該是用字節吧

在記錄的內部位類型是如何存儲的?

一些位類型列的值是存儲在一個字節中的,最大可以到8個位,通常,我們會有如下表定義

CREATE TABLE BitTest(    A bit    B bit    C bit    D int)

記錄的定長部分數據需要占用5個字節,4個字節存儲int 列 ,而另一個字節存儲A 、B、C這三列位類型的數據,只用了字節里面的3個位

我們再添加一些列

CREATE TABLE BitTest(    A bit    B bit    C bit    D int    E bit    F bit    G bit    H smallint    I bit    J bit    K bit)

E到G列按道理來說應該存儲在D列的后面,但是他們會繼續使用第一個 bit byte,直到第一個 bit byte使用完所有的位空間為止

下面的圖顯示了H列(smallint)直接存儲在D列的后面,而在D列后面是存儲K列的新bit byte,因為第一個bit byte已經滿了

當讀取行記錄里的位類型時我們需要知道的狀態

很明顯,我們一次不能只讀取一個字段的值,我們讀取固定長度數據類型的時候還需要讀取定長數據偏移指針

我們需要一些能在讀取的時候指示我們當前讀取到字節中哪一個位屬于哪一個字段的狀態,然后我們讀取一個新的bit byte

我來介紹一下RecordReadState類

public class RecordReadState{    // We start out having consumed all bits as none have been read    private int currentBitIndex = 8;    private byte bits;    public void LoadBitByte(byte bits)    {        this.bits = bits;        currentBitIndex = 0;    }    public bool AllBitsConsumed    {        get { return currentBitIndex == 8; }    }    public bool GetNextBit()    {        return (bits & (1 << currentBitIndex++)) != 0;    }}

RecordReadState 類當前只需要處理bits,但是將來我可能還要創建一個BitReadState 類用來保存讀取狀態

RecordReadState 類保存了一個字節用來當作指針指出下一個可用的位在字節的哪個地方,如果字節已經用完了存儲滿了所有的位數據

(currentBixIndex = 8 (0-7 being the available bits)),方法AllBitsConsumed 就會返回true,指示我們需要讀取一個新的bit byte

GetNextBit方法只是簡單的從bit byte中讀取當前的bit ,然后將currentBitIndex(bit index)的值加1

demo

using NUnit.Framework;using OrcaMDF.Core.Engine.Records;namespace OrcaMDF.Core.Tests.Engine.Records{    [TestFixture]public class RecordReadStateTests{        [Test]public void General(){var state = new RecordReadState();// No bits availableAssert.IsTrue(state.AllBitsConsumed);state.LoadBitByte(0xD2); // 11010010// Bits availableAssert.IsFalse(state.AllBitsConsumed);// Reading bit valuesAssert.IsFalse(state.GetNextBit());Assert.IsTrue(state.GetNextBit());Assert.IsFalse(state.GetNextBit());Assert.IsFalse(state.GetNextBit());Assert.IsTrue(state.GetNextBit());Assert.IsFalse(state.GetNextBit());Assert.IsTrue(state.GetNextBit());// One bit leftAssert.IsFalse(state.AllBitsConsumed);Assert.IsTrue(state.GetNextBit());// Bits exhausted, ready for next byteAssert.IsTrue(state.AllBitsConsumed);}}}

SqlBit實現

一旦我們實現了狀態的讀取,我們就可以實現SqlBit 類型

public class SqlBit : ISqlType{    private readonly RecordReadState readState;    public SqlBit(RecordReadState readState)    {        this.readState = readState;    }    public bool IsVariableLength    {        get { return false; }    }    public short? FixedLength    {        get        {            if (readState.AllBitsConsumed)                return 1;            return 0;        }    }    public object GetValue(byte[] value)    {        if(readState.AllBitsConsumed && value.Length != 1)            throw new ArgumentException("All bits consumed, invalid value length: " + value.Length);        if (value.Length == 1)            readState.LoadBitByte(value[0]);        return readState.GetNextBit();    }}

SqlBit 在構造函數里傳入一個read state,read state指示當前記錄讀取操作的范圍。需要注意的是固定長度需要依據read state里的當前AllBitsConsumed值

如果字節里面所有位都被占用,那么意味著需要讀取整個字節,如果if (readState.AllBitsConsumed)返回0表示不需要讀取整個字節,但是GetValue方法依然會被調用

GetValue方法會驗證一種情況:readState.AllBitsConsumed 返回真,證明 bit byte是有數據存儲在里面,但是value.Length返回的長度是0,那證明有問題了

如果我們讀到一個值,我們會請求read state 去裝載一個新的bit byte ,之后,我們可以調用GetNextBit 方法返回read state的當前bit

相關測試

using NUnit.Framework;using OrcaMDF.Core.Engine.Records;using OrcaMDF.Core.Engine.SqlTypes;namespace OrcaMDF.Core.Tests.Engine.SqlTypes{    [TestFixture]    public class SqlBitTests    {        [Test]        public void GetValue()        {            var readState = new RecordReadState();            var type = new SqlBit(readState);            // No bytes read - length is one            Assert.AreEqual(1, type.FixedLength);            // Load byte and check length is 0            readState.LoadBitByte(0xD2);            Assert.AreEqual(0, type.FixedLength);            Assert.IsFalse((bool)type.GetValue(new byte[0]));            Assert.IsTrue((bool)type.GetValue(new byte[0]));            Assert.IsFalse((bool)type.GetValue(new byte[0]));            Assert.IsFalse((bool)type.GetValue(new byte[0]));            Assert.IsTrue((bool)type.GetValue(new byte[0]));            Assert.IsFalse((bool)type.GetValue(new byte[0]));            Assert.IsTrue((bool)type.GetValue(new byte[0]));            // One bit left - length should still be 0            Assert.AreEqual(0, type.FixedLength);            Assert.IsTrue((bool)type.GetValue(new byte[0]));            // All bits consumed - length should be 1            Assert.AreEqual(1, type.FixedLength);        }    }}

第五篇完


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久亚洲成人| 一区二区欧美久久| 国产福利精品在线| 欧美高清理论片| 亚洲欧美日韩国产成人| 国产精品久久久久免费a∨大胸| 国产精品成熟老女人| 国产日韩欧美影视| 96精品久久久久中文字幕| 7m精品福利视频导航| 欧美性xxxxxxxxx| 久久99精品视频一区97| 欧美野外wwwxxx| 九九热99久久久国产盗摄| 欧亚精品在线观看| 欧美在线视频免费观看| 日韩精品有码在线观看| 日韩激情第一页| 国产视频福利一区| 欧美日韩高清区| 欧美巨乳美女视频| 久久精品中文字幕一区| 精品久久久久久中文字幕大豆网| 国产美女直播视频一区| 成人免费大片黄在线播放| 精品无码久久久久久国产| 久久久久久久一区二区| 欧美日韩亚洲国产一区| 91麻豆桃色免费看| 亚洲色图日韩av| 国产精品久久久999| 成人97在线观看视频| 日韩欧美a级成人黄色| 国产亚洲一区精品| 菠萝蜜影院一区二区免费| 国产精品中文字幕久久久| 亚洲高清福利视频| 国产精品国产亚洲伊人久久| 成人a级免费视频| 日本久久久久久| 日韩日本欧美亚洲| 亚洲精品在线看| 96sao精品视频在线观看| 精品久久香蕉国产线看观看亚洲| 日韩美女在线看| 欧美野外wwwxxx| 久久精品成人欧美大片古装| 精品久久久一区二区| 精品呦交小u女在线| 欧美怡春院一区二区三区| 亚洲欧美国产一本综合首页| 欧美大人香蕉在线| 自拍偷拍亚洲精品| 国产精品欧美一区二区三区奶水| 中文字幕亚洲一区二区三区| 狠狠躁天天躁日日躁欧美| 92裸体在线视频网站| 国产女人18毛片水18精品| 久久av红桃一区二区小说| 91日韩在线视频| 日韩黄色高清视频| 久久精品99久久久香蕉| 久久综合电影一区| 国产视频福利一区| 日韩欧美aⅴ综合网站发布| 欧美在线观看网址综合| 日韩中文字幕视频在线| 26uuu另类亚洲欧美日本一| 激情亚洲一区二区三区四区| 中文字幕日韩免费视频| 亚洲情综合五月天| 亚洲自拍另类欧美丝袜| 国产精品一区二区久久精品| 久久精品视频网站| 国产亚洲人成网站在线观看| 欧美激情免费观看| 日韩欧美国产中文字幕| 一区二区国产精品视频| 国产福利精品视频| 国产999视频| 欧美与欧洲交xxxx免费观看| 九九热最新视频//这里只有精品| 欧美日韩国产限制| 海角国产乱辈乱精品视频| 国产福利视频一区| 热门国产精品亚洲第一区在线| 最近免费中文字幕视频2019| 国产精品香蕉av| 日韩视频亚洲视频| 亚洲精品小视频| 亚洲欧美国产视频| 欧美激情区在线播放| 日韩中文字幕第一页| 国产精品女人网站| 亚洲国产97在线精品一区| 亚洲精品v天堂中文字幕| 69久久夜色精品国产69| 97视频在线播放| 国产欧美日韩丝袜精品一区| 久久久久久久久久久人体| 国产精品一区二区三| 992tv成人免费影院| 97精品视频在线播放| 亚洲欧美另类国产| 国产精品va在线播放| 日韩av片免费在线观看| 日韩av色综合| 欧美大荫蒂xxx| 国产精品一区av| 国产v综合v亚洲欧美久久| 欧美激情va永久在线播放| 久久久精品国产一区二区| 欧美激情videoshd| 国产日韩欧美影视| 欧美高清视频一区二区| yw.139尤物在线精品视频| 国产精品三级美女白浆呻吟| 亚洲欧美另类在线观看| 亚洲男人天堂网站| 色偷偷偷综合中文字幕;dd| 日韩一区二区欧美| 亚洲国产欧美一区二区三区同亚洲| 国产精品男女猛烈高潮激情| 国产精品爱久久久久久久| 国产精品久久久久一区二区| www.日韩av.com| 狠狠躁18三区二区一区| 91免费版网站入口| 亚洲第一精品自拍| 亚洲片国产一区一级在线观看| 亚洲欧洲高清在线| 国产成人拍精品视频午夜网站| 57pao成人国产永久免费| 国产主播在线一区| 色偷偷噜噜噜亚洲男人| 欧美自拍视频在线观看| 亚洲一区二区精品| 动漫精品一区二区| 成人在线国产精品| 日韩电影中文字幕一区| 国产免费一区二区三区在线观看| 亚洲字幕在线观看| 在线观看91久久久久久| 亚洲国产高清高潮精品美女| 日韩电影免费在线观看中文字幕| 亚洲自拍av在线| 一本一道久久a久久精品逆3p| 欧美成aaa人片在线观看蜜臀| 777777777亚洲妇女| 久久国产精品久久久| yw.139尤物在线精品视频| 欧美亚洲成人免费| 欧美性色xo影院| 欧美成aaa人片在线观看蜜臀| 在线看日韩欧美| 久久久亚洲成人| 欧美激情国产高清| 久久激情视频免费观看| 69久久夜色精品国产69乱青草| 久久久久久久久综合| 国产精品夜色7777狼人| 中文字幕日韩欧美| 亚洲成人激情小说| 国产精品久久久久久久久久久不卡|