34,596
社区成员
发帖
与我相关
我的任务
分享
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, 0, 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;
}
create database db1
go
use db1
go
select top 50000 id=identity(int,0,1),col2=null,col3='abc',col4='gif' into tb1 from sysobjects a,sysobjects b
go
create database db2
go
use db2
go
select top 50000 id=identity(int,0,1),col2='abc',col3='abc',col4='gif' into tb1 from sysobjects a,sysobjects b
go
--执行完毕后,查看两数据库属性,都为大小:2.73M,可用0.94M.
/*
drop table tb1
use db1
drop table tb1
use master
drop database db1,db2
*/
Select len(null)
--------------
null
應該不占用吧.