http://gitlab2.xugu.com/cyj/xugusql 1.连接: 1.1 客户端主动发起连接,创建socket后,向服务端发出连接字符串: login database = '数据库名' user = '用户名' password = '口令' [ encryptor = '加密库的解密口令' ] [ char_set = '客户端使用的字符集名'] [ time_zone='时区'] [iso_level='事务隔离级别'] [ lock_timeout='加锁超时' ] [ auto_commit='on或off'] [ strict_commit='on或off'] [ result='char'] [ return_schema='on或off ] [ return_cursor_id='on或off ] [ lob_ret='descriptor'] [ return_rowid = true] version='客户端协议版本号' 解释: 连接串中除了login database=数据库名 user = '用户名' password = '口令' 外,其余为可选项,若未指定那些项,则系统为连接设置默认值 数据解密口令:用于启动加密数据库,若库未加密,则可不要,但带上此参数不会影响连接 客户端使用的字符集名: 'GB2312' ,'GBK','BIG5' 等,默认为GBK 时区: 'GMT +08:00' 事务隔离级别: 'READ COMMITED':读已提交 'REPEATIABLE READ':可重复读 'SERIALIZABLE':序列化 加锁超时: 毫秒数,表示本连接中的事务在争用锁时,最多等候的时间,若在此时间内加锁不成功,则回滚事务并报错 auto_commit: on:表示自动提交,即每个命令都作为一个事务,命令完成立即提交 off:非自动提交,需要 commit命令才提交 strict_commit: 是否该连接中执行的事务使用严格提交(即须记实了事务日志才向客户端返回'K') result='char': 当设置了该项后,则float,integer等不以字串方式返回的结果皆强制使用字符串方式返回(此项对于odbc,jdbc等标准驱动皆不使用) return_schema: 是否在返回字段名信息时加上模式名,若设置为'on',则返回的字段名形式为: 模式名.表名.字段名 '%' 别名,否则返回的字段名形式为:表名.字段名 '%' 别名 return_cursor_id: 若该项设置为'on',则存贮过程的ref_cursor的返回值为cursor的ID号,此时,客户端若要使用ref_currsor的结果,则应使用fetch命令,cursor的名为: 'CurN' + 游标号的16进制字串, 若该项设置为off或没有该项,则将在返回结果中直接嵌入ref_cursor的结果集 lob_ret='descriptor': 该项目前服务器版本中没有,拟新加入,若有该项,则在返回大对象时不以数据形式返回,代之以描述符,当真正需要大对象数据时,使用 GET LOB 大对象描述符;命令从服务器取回数据 version: 客户端协议版本,目前都应是:'201' 1.2 服务器端: 发回字节'K'表示成功,否则,发回错误信息(见错误信息格式)并立即关闭连接 2.所有DML及DDL访问: 2.1 客户端发出访问: QryStream: '?' Comand_Len Comand_str Param_num { Param_name_len Param_name Param_INOUT Param_DType Param_Data_Len Param_Data }* ? 5 ? STC 1 0 1 type_int 4 1 解释: Command_len: 命令长度(网络序32位整数,计算命令长度时不包括结束符0x0) Command_str: 命令字串(发送时应包括结束符0x0) Param_num: 参数个数(网络序16位整数,若没有参数则此值为0) Param_name_len: 参数名字长度(网络序短整数,若参数无名,则此值为0) Param_name: 参数名(该部分字节数应与Param_name_Len一致) Param_INOUT: 参数输出输入类型(网络序16位整数) Param_DType: 参数数据类型号(网络序16位整数) Param_Data_Len: 参数长度(网络序32位整数) Param_Data: 参数数据(该部分字节数应与Param_Data_Len一致) {}*: 表示参数部分可有0至多个参数,其重复的次数取决于Param_num,若Param_num为0,则没有参数需要发送 2.2 服务器返回: 服务器可返回一组或多组信息,并以字节'K'标识所有信息已传送完毕 SrvResponse: { FormArgDescri | SelectResult | InsertResult | UpdateResult | DeleteResult | ProcRet | OutParamRet | ErrInfo | WarnInfo | Message }* 'K' FormArgDescri: '$' Arg_Num { Arg_Name_Len Arg_Name Arg_No Arg_DType Arg_Preci_Scale }+ SelectResult: 'A' Field_Num { Field_Name_Len Field_Name Field_DType Field_Preci_Scale Field_Flag }+ { 'R' Col_len1 Col_Data1 ... }* InsertResult: 'I' Rowid_Len Rowid_Data UpdateResult: 'U' Update_Num DeleteResult: 'D' Delete_Num ProcRet: 'O' Ret_DType Ret_Data_Len Ret_Data OutParamRet: 'P' Out_Param_No Out_Param_DType Out_Param_Len Out_Param_Data ErrInfo: 'E' Err_Str_Len Err_Str WarnInfo: 'W' Warn_Str_Len Warn_Str Message: 'M' Msg_Str_Len Msg_Str 解释: FormArgDescri: 形式参数描述,执行prepare语句后,通常返回此部分信息 Arg_Num: 形参个数(网络序32位整数) Arg_Name_Len: 形参名长度(网络序32位整数) Arg_Name: 形参名(字节数与Arg_Name_Len一致) Ar_No: 形参的序号(网络序32位整数,若prepare语句中使用?号表示参数,则服务器按?号的顺序从1开始为其设定序号) Argg_DType: 形参的数据类型ID(网络序32位整数) Arg_Preci_Scale: 形参的精度标度(网络序32位整数 SelectResult: 查询结果集,包含一组结果集字段描述 以及0至多个行数据 Field_Num: 结果集字段数 Field_Name_Len: 字段名长度(网络序32位整数) Field_Name: 字段名(字节数与Field_Name_Len一致) Field_DType: 字段数据类型ID(网络序32位整数) Field_Preci_Scale:字段的精度标度(网络序32位整数,若为-1或0表示没有精度标度信息,否则高16位为精度低16位为标度) Field_Flag: 字段的其它属性标志(网络序32位整数),其中每一个位表征字段的某一个特性,各位对应的特性如下 FIELD_BASE_TAB=1, /* 表示字段是实际的表的字段(否则,表示字段实际上是表达式) */ FIELD_NOT_NULL=2, /* 表示字段具有非空约束 */ FIELD_IS_PRIMARY=4, /* 表示字段是主键 */ FIELD_IS_SERIAL=8, /* 表示字段是序列值 */ FIELD_IS_TIMESTAMP=16, /* 表示字段是timestamp */ FIELD_IS_LOB=32, /* 表示字段是大对象类型 */ FIELD_IS_UNIQUE=64, /* 表示字段是唯一值类型 */ FIELD_IS_ROWID=128, /* 表示字段是rowid */ FIELD_IS_DUMMY=256, /* 表示字段不应输出 */ FIELD_IS_HIDE=512, /* 表示字段是隐藏字段 */ Col_len: 列数据长度(网络序32位整数) Col_Data: 列数据(字节数与Col_Len一致) 注: 返回结果中,记录数据由 'R'开头,后跟若干个列的长度及数据,每个'R'后的列数据个数为Field_Num个 InsertResult: 插入语句的返回结果 Rowid_Len: 插入语句返回的新行的ROWID数据的长度 Rowid_Data: 插入语句返回的新行的ROWID数据(为base64编码) UpdateResult: 更改语句返回的结果 Update_Num: 更改语句影响的行数(网络序32位整数) DeleteResult: 删除语句的返回结果 Delete_Num: 删除的行数 ProcRet: 存贮函数调用的返回值 Ret_DType: 返回值数据类型(网络序32位整数) Ret_Data_Len: 返回值数据长度(网络序32位整数) Ret_Data: 返回值数据 OutParamRet: 返回型参数 Out_Param_No: 返回型参数的参数号 Out_Param_DType:返回参数的数据类型(网络序32位整数) Out_Param_Len: 返回参数的数据长度(网络序32位整数) Out_Param_Date: 返回参数的数据 ErrInfo: 错误信息(通常在返回数据的最后出现,即出现在 'K'字符前) Err_Str_Len: 错误信息长度(网络序32位整数) Err_Str: 错误信息(字节数与Err_Str_Len一致) WarnInfo: 警告信息(通常在返回数据的最后出现,即出现在 'K'字符前) Warn_Str_Len: 警告信息长度(网络序32位整数) Warn_Str: 警告信息(字节数与Warn_Str_Len一致) Message: 通知信息(出现的位置没有一定的规定) Msg_Str_Len: 通知信息长度(网络序32位整数) Msg_Str: 通知信息(字节数与Msg_Str_Len一致) 注: {}* 中各种返回信息是并列的关系,可能一次返回中含有0个至多个返回信息,不能假定改到其中其种返回信息就认为没有其它种类的返回信息, 有些类型的返回信息甚至可能重重出现,如:一次发多条select 语句就会造成返回信息中包含多个查询结果集. 2.3 关于新版本中将增加的大对象数据返回形式的说明 a) 当在连接中未加入了 lob_ret='descriptor'子串时,使用原来的方式返回大对象数据 b) 当在连接中加入了 lob_ret='descriptor'子串时,应该将大对象对应的列返回值视作描述符,描述符分两种:一种为内嵌在行内的大对象数据的描述符,一种为非内嵌大对象描述符 内嵌大对象描述符: BLOB类型:'b' + 大对象数据 即:大对象数据仍直接返回,只是前面加了一个 'b'字符,因此大对象数据的长度实际为列数据长度-1 CLOB类型:'c' + 大对象数据 即:大对象数据仍直接返回,只是前面加了一个 'c'字符,因此大对象数据的长度实际为列数据长度-1 非内嵌大对象描述符: BLOB类型: 'B' + 大对象描述符字串 ,该字符串由两部分组成:前面为descriptor的base64编码,后面为大对象的数据长度(10进制数值串), 中间由空格分开;整个串的长度为列数据长度-1; CLOB类型: 'C' + 大对象描述符字串,其余与BLOB相同 c) 当大对象字段返回的字段长度为0时,仍表示该字段为空值,不能再去取该字段的数据作为描述符用 d) 对于内嵌大对象,驱动应保存其数据,而不能从服务器另取数据 e) 对于非内嵌大对象,驱动在向应用程序返回数据时使用: GET LOB '大对象描述符' offset 偏移量 limit 读取长度; 命令来读取大对象数据. (注意:大对象描述符串包括前面的‘B’或‘C’, 但不包含后面的大对象长度字串,描述前后有'号) 服务端以单行单列结果集的形式返回数据: 对于BLOB,返回的字段名为:BLOBDATA,返回记录的数据长度为实际读取长度(通常就是limit,若已读到尾,则小于limit), 对于CLOB,返回的字段名为:CLOBDATA,若不存在库字符集与客户端字符集的差异,则返回记录的数据长度为实际读取长度, 否则,返回的数据长度为字符集转换后的长度,当然,内容也就为转换后的内容。 3.数据类型ID的取值:以下取值未写明数值的按有数值的依次向下增1 TYPE_EMPTY = 0, TYPE_NULL, TYPE_BOOL, TYPE_I1, TYPE_UI1, TYPE_I2, TYPE_UI2, TYPE_I4, TYPE_UI4, TYPE_I8, TYPE_UI8, TYPE_R4, TYPE_R8, TYPE_DATE, TYPE_TIME, TYPE_DATETIME, TYPE_TIMESTAMP, TYPE_INTERVAL_D2S, TYPE_SMALLTIME, TYPE_TIME_TZ, TYPE_DATETIME_TZ, TYPE_INTERVAL_Y2M, TYPE_DECIMAL, TYPE_NUMERIC, TYPE_CY, TYPE_STR, TYPE_CHAR, TYPE_VARCHAR, TYPE_CLOB, TYPE_BINARY, TYPE_BLOB, TYPE_IMAGE, TYPE_BLOB_INROW, TYPE_BLOB_S, TYPE_BLOB_M, TYPE_BLOB_OM, TYPE_STREAM, TYPE_AUDIO, TYPE_VIDEO, TYPE_ROWVER, TYPE_INTERVAL_Y, TYPE_INTERVAL_M, TYPE_INTERVAL_D, TYPE_INTERVAL_H, TYPE_INTERVAL_MI, TYPE_INTERVAL_S, TYPE_INTERVAL_D2H, TYPE_INTERVAL_D2M, TYPE_INTERVAL_H2M, TYPE_INTERVAL_H2S, TYPE_INTERVAL_M2S, TYPE_GUID, TYPE_GEOMETRY=60, TYPE_POINT, TYPE_BOX, TYPE_POLYLINE, TYPE_POLYGON, TYPE_MAX_SYS=100, TYPE_BLADE_BEGIN=101, TYPE_BLADE_END=1000, TYPE_OBJECT=1001, /* 对象类型 */ TYPE_RECORD, /* 记录类型 */ TYPE_VARRAY, /* 数组类型 */ TYPE_TABLE, /* 表类型 */ TYPE_IDXBY_TAB, /* index by 表类型 */ TYPE_ROWTYPE, /* 引用行类型 */ TYPE_COLTYPE, /* 引用列类型 */ TYPE_ROW, /* 行类型 */ TYPE_CUR_REC, /* 引用记录类型(不能更改字段) */ TYPE_CURSOR, /* 游标类型 */ TYPE_REFCUR, /* REF_CURSOR类型 */ TYPE_PARAM, TYPE_UDT_BEGIN=1100, 4.数据类型返回格式 2.1.若连接时连接串中有 result='char',则各类型数据的返回值皆转换成字符串的形式进行返回, 数值型(integer,float,numeric等),返回的字符串变由数字与小数点组成 日期型格式:‘2011-3-3’ 时间型格式 ‘12:03:40’或 ‘12:03:40.999' 日期时间型格式:‘2011-3-3 12:34:23' 或 ‘2011-3-3 12:34:23.999' 带时区的日期时间格式:‘2011-3-3 12:34:23+08:00' 或‘2011-3-3 12:34:23-08:00' 带时区的时间格式:‘12:34:23+08:00' 或‘12:34:23-08:00' 2.2若连接串中不含 result='char',则各类型数据的返回值通常以二进制方式返回 char、varchar、clob、numeric等类型以字符串形式返回 数值型(integer等除numeric外)返回格式,就是其二进制格式,只是转换成了网络序 date: 32位网络序整数,为从1970-1-1起流失的天数(负数表示在1970-1-1之前) time: 32位网络序整数,为一天内从0:0:0开始流失的毫秒数 datetime:64位网络序整数,为从1970-1-1起流失的毫秒数(负数表示在1970-1-1之前) time with time zone:6字节,前4字节为32位网络序时间值,后2字节为16位网络序时区值,时间值与time的处理方式一样, 时区值为时区相对于格林威治天文台的时差,单位为分钟,有正负之分。 datetime with time zone:10字节,前8字节为64位网络序日期时间值,后2字节为16位网络序时区值,日期时间值与datetime的处理方式一样, 时区值为时区相对于格林威治天文台的时差,单位为分钟,有正负之分。 interval year: 32位网络序整数,单位为年 interval month: 32位网络序整数,单位为月 interval day: 32位网络序整数,单位为天 interval hour: 32位网络序整数,单位为小时 interval minute:32位网络序整数,单位为分钟 interval second:64位网络序整数,单位为毫秒(微秒 CYJ) 注:interval XX to YY(如interval day to second)其返回的值的格式与 interval YY相同,即:interval day to second 返回格式与interval second相同,余类推