Sql2000、Json、Sqlite3、delphiXE数据库类型对照表
一、对照表及重要说明
Sql2000 Json delphiXE Sqlite3
bigint Int64 ftLargeint BIGINT
binary ByteString ftBytes BINARY
bit Boolean ftBoolean BOOLEAN 在Sql2000中,bit =1或0或null(默认0)。注意:bit的数值代表true(bit=1)或false(bit=0或null)。在Sqlite3中:用BOOLEAN代表,同样此时代表true或false。代码使用时:if LFDMemT1.FieldByName('Z1111').AsBoolean=true then Memo1.Lines.Add('Sql2000的bit值为0或null,sqlite3该列打勾'); LFDMemT1.FieldByName('Z1111').AsBoolean=false then Memo1.Lines.Add('Sql2000的bit值为1,sqlite3该列没有打勾或去勾'); 而其列的返回值不是-1就是0,取决于代表的表达方式: LFDMemT1.FieldByName('Z1111').AsBoolean.ToString(false)=-1,代表:, Bit为1(比特1)返回-1;Bit为0(比特0)返回-1;Bit为null(比特null)返回-1;LFDMemT1.FieldByName('Z1111').AsBoolean.ToString(true)=0 ,代表: Bit为1(比特1)返回0;Bit为0(比特0)返回0;Bit为null(比特null)返回0。它们是恒等式,代表该字段占一个比特位,无实际意义,只是对返回值的表达方式不同而已。
char AnsiString ftString CHAR
datetime DateTimeStamp ftTimeStamp DATETIME
decimal BCD ftFMTBcd DECIMAL //: 当decimal=null时, DECIMAL=null, ftFMTBcd为'' :LFDMemT1.FieldByName('Z1111').AsString=''
float Double ftFloat FLOAT
image Blob ftBlob IMAGE //:中间值转化:<Binary>:用流和内存流做转化
int Int32 ftInteger INT
money Currency ftCurrency MONEY (精度+小数 Json "Precision":19,"Scale":4,)
nchar WideString ftWideString NCHAR
ntext WideMemo ftWideMemo NTEXT
numeric BCD ftFMTBcd DECIMAL //: NUMERIC当成:DECIMAL处理
nvarchar WideString ftWideString NVARCHAR
real Single ftSingle REAL
smalldatetime DateTimeStamp ftTimeStamp TIMESTAMP
smallint Int16 ftSmallint SMALLINT
smallmoney Currency ftCurrency SMALLMONEY
sql_variant WideString ftWideString NVARCHAR2 // : sql_variant类型在SQLServer中是特殊的数据类型, 也是变长的数据类型,包含两部分信息:基础类型和Value,可以存储所有的SQLServer数据类型的数据,引用时需转化:convert( NVarchar( len([FieldName].Value) ) , [FieldName].Value )
text Memo ftMemo TEXT
timestamp ByteString ftBytes TIMESTAMP
//Memo1.Lines.Add('sql2000远程timestamp类型:delphi不支持解析:对于每个表来说是唯一的、自动存储的值。通常用于版本戳,该值在插入和每次更新时自动改变');//12:sql2000的timestamp:ftBytes:
tinyint Byte ftByte INT(1) // : sql2000中代表0~255的ASC码而非码值
uniqueidentifier GUID ftGuid UNIQUEIDENTIFIER
//:35:ftGuid,sql2000远程类型,数值: :无默认值数值自定义:固定格式32位5个分组的SHA1数字:{00000000-0000-0110-0000-000000000000}
//:35:ftGuid:到sqlite3本地类型,数值:{00000000-0000-0000-0000-000000000000}:默认值:固定格式32位5个分组的SHA1数字
varbinary ByteString ftVarBytes VARBINARY
varchar AnsiString ftString VARCHAR
二、数据库Sql2000及Sqlite3所有字段类型
Sql2000
bigint、binary、bit、char、datetime、decimal、float、image、int、
money、nchar、ntext、numeric、nvarchar、real、
smalldatetime、smallint、smallmoney、sql_variant、
text、timestamp、tinyint、uniqueidentifier、varbinary、varchar
Sqlite3
BIGINT、BINARY、BLOB、BLOB_TEXT、BOOL、BOOLEAN、
CHAR、CLOB、CURRENCY、
DATE、DATETEXT、DATETIME、DEC、DECIMAL、DOUBLE、DOUBLE PRECISION、
FLOAT、GRAPHIC、GUID、
IMAGE、INT、INT64、INTEGER、LARGEINT、
MEMO、MONEY、
NCHAR、NVARCHAR、NVARCHAR2、NTEXT、NUMBER、NUMERIC、
PHOTO、PICTURE、RAW、
REAL、SMALLINT、SMALLMONEY、TEXT、TIME、TIMESTAMP、TINYINT、
UNIQUEIDENTIFIER、VARBINARY、VARCHAR、VARCHAR2、WORD
关于Sqlite3的数据类型,可参考以下两位作者的原创:
https://blog.csdn.net/wulianghuan/article/details/11197743
https://www.cnblogs.com/findumars/p/7854338.html
三、关于Sqlite3中的null
if LDestinctFDQuery1.FindField('Z1111')<>nil then
begin
Memo1.Lines.Add(VarToStr(LFDMemT1.FindField('Z1111').DataType)+',sql2000远程类型,数值:'+LFDMemT1.FindField('Z1111').AsString.Trim);
//Memo1.Lines.Add('sql2000远程timestamp类型:delphi不支持解析:对于每个表来说是唯一的、自动存储的值。通常用于版本戳,该值在插入和每次更新时自动改变');//12:sql2000的timestamp:ftBytes:
if LFDMemT1.FindField('Z1111').DataType=ftTimeStamp then
Memo1.Lines.Add(VarToStr(LFDMemT1.FindField('Z1111').DataType)+',sql2000远程数值:'+FormatDateTime('yyyy-mm-dd hh:mm:ss.zzz',LFDMemT1.FindField('Z1111').AsDateTime) );
end;
if LDestinctFDQuery1.FindField('Z1111')<>nil then
begin
Memo1.Lines.Add(VarToStr(LDestinctFDQuery1.FindField('Z1111').DataType)+':sqlite3本地类型,数值:'+LDestinctFDQuery1.FindField('Z1111').AsString.Trim);
if LDestinctFDQuery1.FindField('Z1111').AsString<>'' then
begin
//:sqlite3中null是一种特殊类型:
//:不代表数值为空,而是有值的:AsString<>''判断不出数值为空!!你是取不出来的
if LDestinctFDQuery1.FindField('Z1111').DataType=ftDateTime then
Memo1.Lines.Add(VarToStr(LDestinctFDQuery1.FindField('Z1111').DataType)+',sqlite3本地数值:'+FormatDateTime('yyyy-mm-dd hh:mm:ss.zzz',LDestinctFDQuery1.FindField('Z1111').AsDateTime) );
end;
end;