123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- 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相同,余类推
-
|