微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NULL在SQLServer数据库日志文件中的存储

日志文件ldf中的null

 

参考日志文件结构
http://blog.csdn.net/jinjazz/archive/2008/08/07/2783872.aspx

通过null_bitmap来确定哪些字段为null,所以在日志中null是不占空间的

下面可以在得到一行二进制内容,比如通过fn_dbLog函数或者dbcc checklog,然后检查此行内容那些是列是null

 

 

static byte[] ReadRowData()    {        //代码略去        return null;    }    static void AnerlizeNull()    {        byte[] data = ReadRowData();//表示一行数据的二进制        //从第二个字节算起,data[2]        short index = 2;        //第二字节内容为pos_columns_count,表示第pos_columns_count个字节存放了列数信息,可以把本字节理解为指针        short pos_columns_count = BitConverter.ToInt16(data,index);        //pos_columns_count内容为data_columns_count,表示这个表有data_columns_count列        short data_columns_count = BitConverter.ToInt16(data,pos_columns_count);        //pos_columns_count的后两个字节开始表示了Null列信息,Null列信息不止占用1个字节,因为每列按位保存,如果列多,他的占用字节也多        short pos_null_map = (short)(pos_columns_count + 2);        //算Null信息占用多少字节        int data_null_map_length = (int)System.Math.Ceiling((double)data_columns_count / 8);        //读取Null列的标志内容        byte[] data_null_map = new byte[data_null_map_length];        System.Array.copy(data,pos_null_map,data_null_map,data_null_map_length);        //这里就可以开始检查一个表格的任何一列是否null了,null的数据是不在数据区的,只记录在Null列的标志内容中。        //比如看第10列是否null        checkNull(data_null_map,10);    }    static bool checkNull(byte[] map,short col_order)    {        int mapIndex = (col_order - 1) / 8;        int mapExp = (col_order - 1) % 8;        int iResult = (int)System.Math.Pow(2,mapExp);        return (iResult & map[mapIndex]) != 0;    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐