简介

人大金仓数据库是基于 PostgreSQL 开发的。

SQL语言

语法

关键字

KES:

MYSQL:

语句

*特性MYSQLKES
字符串字面量单引号(')或 双引号(")'
十六进制字面量0x5461626c65X'5461626c65'/
BIT字面量b'1000001',0b1000001/
Boolean字面量常数TRUEFALSE分别取值为1和0。true/false/null
字符串内单引号转义'Don\'t''Don''t'
字段引起来反引号双引号 "Col"
转义字符\不需要转义,单引号内
运算符
特性MYSQLKES
除法/DIV (DIV是整除,/ 是包含小数的)/ 整数除
取余%MOD%
*字符串连接CONCAT(,,,)`
赋值运算符:= (存储过程中) ,= (SET 语句中):=
属性标识%
*字符串分隔符单引号(')或 双引号(")'
标签分隔符<< , >>
带引号的标识符分隔符"
范围运算符..
关系运算符(不相等), !=!=^=
取反逻辑运算符NOT, !NOT
或 逻辑运算符OR, `
异或逻辑运算符XOR
并 逻辑运算符AND, &&AND
*异或 位 运算符^幂运算 pow(a,b)
取反 位 运算符~~
或 位运算符``
并 位 运算符&&

KES参考:http://help.kingbase.com.cn/v8/development/sql-plsql/plsql/plsql-plsql-language-fundamentals.html?highlight=%E8%BF%90%E7%AE%97%E7%AC%A6

MYSQL参考:https://dev.mysql.com/doc/refman/8.0/en/non-typed-operators.html

数据类型

分类类型MysqlKES差异
整数tintyinttintyinttinyintKES不能是无符号的
smallintsmallintsmallintKES不能是无符号的
mediumintmediumintmiddleint mediumint int3不建议使用
intintINTEGER/INTKES不能是无符号的
bigintbigintBIGINTKES不能是无符号的
小数单精度floatREAL / FLOAT§当fload的p取值为 1-24 时,与 REAL 相同。取值范围不一致。
双精度doubleDOUBLE PRECISION / FLOAT§当fload的p取值为 25-53 时,与 DOUBLE PRECISION 相同。取值范围不一致。
精确值decimal(precision, scale)DECIMAL(precision, scale)
NUMERIC(precision, scale)
precision, scale 取值范围不一致。
MYSQL: 0<=precision<=65, 0<=scale<=30。
KES:0<=precision<=1000, 0<=scale<=1000
日期和时间仅日期date/KES中DATE类型是包括日期和时间的
仅时间timeTIMEKES的是可以带时区的
年份year/
日期加时间datetimeDATE
时间戳timestampTIMESTAMPKES的是可以区分标准时区与本地时区
间隔interval [ fields] [(’p’)]MYSQL 在date函数中会使用INTERVAL 语法
字符串定长char(m)character(n [char | byte])
char(n [char | byte])
char(n [char | byte])
mysql:0-255字节
KES:n 缺省值为 1。最大长度是 10485760 个字节或者字符。char 或 byte 的默认值由。NLS_LENGTH_SEMANTICS 确定。
变长varchar(m)character varying[(n [char | byte])])
varchar(n [char | byte])
varchar2(n [char | byte])
nvarchar2(n [char | byte])
nvarchar(n [char | byte])
MYSQL:0-65535 字节
KES:n 取值最小为 1 字节或 1 字符,最大 10485760 字节或字符。n 缺省值为 1。char 或 byte 的默认值由NLS_LENGTH_SEMANTICS 确定。(n 可以取’*’, 表示不限制长度)
NVARCHAR表示是Unicode编码。
tinyblob,tinytext/
blob,text/KES中TEXT与MYSQL中TEXT的定义意义不一样。
mediumblob/
mediumtext/
无限变长longblob,longtextTEXTMYSQL:限制为2^32 – 1
KES:限制为1G(2^30)
大对象类型变长的二进制大对象/BLOBMYSQL中BLOB的长度限制为65535。
KES最大为1G。
变长字符大对象/CLOBKES:最大为1G。
变长字符大对象/NCLOBKES:最大为1G。unicode编码
位类型定长位类型bitBIT[(n)]
变长位类型/BIT VAYRING(n)
定长二进制binary(n)/
变长二进制串varbinary(n)BYTEAMYSQL:最大4G。
KES:变长二进制串, 长度最大为 1G
布尔类型/BooleanMysql用 tinyint代替,在jdbc中有差异。
KES中可取值:true/false。
序数类型/smallserial
/serial
/bigserial
货币类型/MONEY
空间类型具体不列了,内容太多了
搜索类型/具体不列了,内容太多了
XML具体不列了,内容太多了
JSON具体不列了,内容太多了

表格里的/表示不存在对应的特性。

在人大金仓中 空字符会自动转换为NULL。与空字符串比较,其实就是与NULL比较,不能用等号。#kingbase.config可以设置 ora_input_emptystr_isnull = false,限制这种转换。

参考:https://help.kingbase.com.cn/v8/development/sql-plsql/sql/datatype.html

注意点

1、KES中的整型不存在有符号、无符号的分别。都是有符号数。

2、KES中的自增使用的不是Auto_Increatment,是XXXXserial类型。(好像可以兼容)

3、Mysql中字符串类型中n指的是字符,但是总长度受字节限制。KES中可以通过系统设置是字符,还是字节。

4、一些特殊类型

  • UUID: 是128位的存储,不是字符串。
  • IP地址:
  • 对象标识符类型
  • 伪类型

5、KES有一些类型叫范围类型组合类型,对象类型,等等,都不建议使用,太生僻了。

6、很多产品相关的类型,建议完全不用。

这些KES的方言类型完全不建议使用。另外有些违背了数据库范式。

数据类型比较

跟Mysql类似

数据类型转换

支持将值从一种数据类型隐式和显式转换为另一种数据类型。

建议都采用显示转换

DML

仅标准SQL是一致的,其他不完全一致。

DDL

注意:

  • 仅列常用语法,或者某个语法的常用部分。
  • 仅列由于mysql语法引出的,不列KES的方言特性。

KES参考:https://help.kingbase.com.cn/v8/development/sql-plsql/sql/SQL_Statements_6.html

创建表

-- KESCREATE TABLE [ IF NOTEXISTS ] table_name ( [{ column_name data_type [ INVISIBLE | VISIBLE ] [ COLLATE collation ] [ column_constraint [ ... ] ]| table_constraint| LIKE source_table [ like_option ... ] }[, ... ]] )[ INHERITS ( parent_table [, ... ] ) ][ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [COLLATE collation ] [ opclass ] [, ... ] ) [ partition_extented_spec ] ][ USING method ][ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ][ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ][ WITH ( ONCOMMIT = value ) ][ TABLESPACE tablespace_name ][ { ENABLE | DISABLE } [ VALIDATE | NOVALIDATE ] constraint [ ... ] ][ ENCRYPTED [BY tablekey ]]
自增列

KES:

-- 通过 serial,smallserial,bigserial 。可以为NULL。CREATE TABLE cinemas (id serial,name text,location text) -- 通过auto_increment ,会自动转换为 serial。-- pgsql 不支持,人大金仓支持。CREATE TABLE cinemas (id int auto_increment,name text,location text) 

MYSQL:

CREATE TABLE cinemas (id int auto_increment,name text,location text) 
主键

KES:

-- 列约束 CREATE TABLE distributors (did integer CONSTRAINT firstkey PRIMARY KEY,namevarchar(40));CREATE TABLE distributors (did integer PRIMARY KEY,namevarchar(40));-- 表约束CREATE TABLE distributors (did integer,namevarchar(40),PRIMARY KEY(did));

MYSQL:

CREATE TABLE distributors (did integer PRIMARY KEY,namevarchar(40));-- 表约束CREATE TABLE distributors (did integer,namevarchar(40),PRIMARY KEY(did));
唯一索引

KES:

-- 字段约束CREATE TABLE distributors (did integer,namevarchar(40) UNIQUE);-- 或者 表约束CREATE TABLE distributors (did integer,namevarchar(40),UNIQUE(name));

MYSQL:

-- 字段约束CREATE TABLE distributors (did integer,namevarchar(40) UNIQUE);-- 或者 表约束CREATE TABLE distributors (did integer,namevarchar(40),UNIQUE(name));
普通索引

通过约束可以创建索引

注释

MYSQL:

-- 加在表定义以及列定义后面comment 'this is a comment'-- 没有专门命令删除comment。

KES:

-- 表加注释Comment ontable [tablename] IS'表注释'-- 列加注释Comment oncolumn[tablename].ColumnNameIS'列注释'-- 删除表注释Comment ontable [tablename] ISNULL-- 删除列注释Comment oncolumn[tablename].ColumnNameISNULL
自动更新修改时间

MYSQL:

`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,`gmt_update` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

KES:

 modtime timestamp DEFAULT current_timestamp-- 插入时的默认值

KES没有 ON UPDATE CURRENT_TIMESTAMP,只能通过创建触发器来实现了。

分区

不一致。略。

通过一个查询创建表

KES:

CREATE TABLE films_recent ASSELECT * FROM films WHERE date_prod >= '2002-01-01';

MYSQL:

CREATE TABLE films_recent ASSELECT * FROM films WHERE date_prod >= '2002-01-01';

索引

创建索引

KES参考:http://help.kingbase.com.cn/v8/admin/general/administrator-guide/14-managing-indexes.html?highlight=%E7%B4%A2%E5%BC%95

KES:

-- 显式地创建索引CREATE INDEX emp_ename_index ON emp(ename) TABLESPACE users_space;--创建唯一索引CREATE UNIQUE INDEX dept_unique_index ON dept (dname) TABLESPACE users_space;-- 创建B+树索引 (索引可以指定 排序,NULL顺序处理)CREATE INDEX test2_info_nulls_low ON test2 (info NULLS FIRST);-- 创建HASH索引 CREATE INDEX name ON table USING HASH (column);-- 函数索引CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));-- 多列索引CREATE INDEX test2_mm_idx ON test2 (major, minor);

注意:本地和全局索引

MYSQL:

mysql的索引类型只有BTree和Hash

修改索引

删除索引

KES:

DROP INDEX [index_name];-- 删除通过约束创建的索引ALTER TABLE [tablename] DROP CONSTRAINT [constraint_name];

MYSQL:

DROP INDEX index_name ON tbl_name

Mysql的索引是在表上的,不同table上的索引名称可以相同。

修改表

-- KESALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]action [, ... ]

ONLY 表示只修改本表,不修改后代表。 默认都必须加上。

另外不建议使用后代表。

新增列

KES:

ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ]... ...

MYSQL:

ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name]DROP [COLUMN] col_nameALTER [COLUMN] col_name .......MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]RENAME COLUMN old_col_name TO new_col_name

MYSQL修改列方式更复杂。

修改列类型

KES:

ALTER [ COLUMN ] column_name ...MODIFY column_name [ datatype ][ NULL | NOT NULL ]MODIFY ( column_name [ datatype ][ NULL | NOT NULL ][, ... ] )
删除列

KES:

DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]

MYSQL:

DROP [COLUMN] col_name

删除表

兼容。略。

创建序列

CREATE [ TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ] name [ INCREMENT [ BY ] increment ][ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ][ START [ WITH ] start ] [ CACHE cache ] [ NOCACHE ] [ [ NO ] CYCLE ] [ NOCYCLE ][ ORDER ] [ NOORDER ] [ OWNED BY { table_name.column_name | NONE } ]
-- 创建一个序列 (一般对应mysql 的auto_increatment)CREATE SEQUENCE serial_A START 1;-- 使用一个序列select nextval('serial_A')

序列是基于bigint的。

setval(,)用于设置当前序列号。下个序列为 设置的值加1。

删除序列

KES:

DROP SEQUENCE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

MYSQL:

不涉及

函数

此处仅比较常用函数,特殊数据类型比如:xml,json,空间数据等处理函数肯定是不一样的,参考官方文档。

控制流函数

函数MYSQLKES
CASECASE VALUE WHEN … THEN … ELSE … END
CASE WHEN … THEN … ELSE … END
CASE VALUE WHEN … THEN … ELSE … END
CASE WHEN … THEN … ELSE … END
根据值的真假返回值IF(expr1,expr2,expr3)if(expr1 INT兼容类型, expr2 任意类型, expr3 任意类型)
根据值是否为null,返回值IFNULL(expr1,expr2)ifnull(expr1, expr2)
相等则返回nullNULLIF(expr1,expr2)nullif(expr1, expr2)

函数一致。

MYSQL参考:https://dev.mysql.com/doc/refman/8.0/en/flow-control-functions.html

KES参考:http://help.kingbase.com.cn/v8/development/sql-plsql/sql/Function.html#if

数学函数

MYSQL参考:https://dev.mysql.com/doc/refman/8.0/en/numeric-functions.html

KES参考:http://help.kingbase.com.cn/v8/development/sql-plsql/sql/Function.html#id5

MYSQL 函数说明KES函数
ABS()绝对值abs (n)
ACOS()arc cosineacos(n)
ASIN()arc sineasin(n)
ATAN()arc tangentatan(n)
ATAN2(), ATAN()反正切atan2(n1, n2)
CEIL()返回不小于给定数的最小整数ceil(n)
CEILING()CEIL()同义词ceiling({dp|numeric})
CONV()不同进制进行转换/
COS()余弦cos(n)
COT()余切cot(n)
CRC32()CRC32计算/
DEGREES()转换弧度为度数degrees(dp)
DIV整数除div(y numeric, x numeric)
EXP()返回自然常数e的x次幂exp({dp|numeric})
FLOOR()返回不大于给定数的最大整数FLOOR({dp|numeric});
LN()返回给定数的自然对数。小于0的数返回null。ln({dp|numeric})
LOG()返回给定数指定底数的对数。LOG(X), LOG(B,X)。仅指定一个参数,则以e作为底数。log({dp|numeric})
log(n2 numeric, n1 numeric)
LOG10()返回以10为底的对数log10({numeric|double})
LOG2()返回以2位第的对数/
MOD()取模mod(y,x)
PI()返回PI值。pi()
POW()POW(X,Y),返回X的Y次幂/使用POWER
POWER()POW 同义词power(a dp, b dp)
power(a numeric, b numeric)
RADIANS()返回给定度数对应的弧度。radius(circle)
RAND()返回一个随机数。[0.0 ,1.0)random()
ROUND()ROUND(X), ROUND(X,D)。D不指定则为0。D的绝对值最大为30。D可为负数。四舍五入近似到指定小数位数,round({dp|numeric})
round(v numeric, s int)
SIGN()返回数的符号。1,0,-1sign({dp|numeric})
SIN()sinsin({dp|numeric})
SQRT()返回平方根。负数返回null。sqrt(n)
TAN()tanTAN(n)
TRUNCATE()截断数字到指定位数小数。当小数位是负数时,往左移。TRUNC(number)

日期和时间函数

MYSQL参考:https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html

MYSQL函数描述KES函数
ADDDATE()ADDDATE(date,INTERVAL expr unit), ADDDATE(date,days)。
当使用inteval方式时,ADDDATE()和DATE_ADD()是同义词。
days 参数如果是小数,则采用四舍五入取整。
无对应的函数,可以使用 (time + interval ‘-1 day’)。
ADDTIME()ADDTIME(expr1,expr2)。把expr2加到expr1。expr2必须是个time类型。/
CONVERT_TZ()CONVERT_TZ(dt,from_tz,to_tz),把时间从一个时区转换为另一个时区。/
CURDATE()返回当前日期。格式YYYY-MM-DD(string类型),YYYYMMDD(数字类型)/
CURRENT_DATE(), CURRENT_DATE当前日期。不包含时间current_date()。返回的是包含时间部分为0的日期。KES中是有时区的
CURRENT_TIME(), CURRENT_TIME当前时间,不包含日期。current_time(precision)。 ,current_time
带有时区的时间
CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP返回当前时间戳current_timestamp(precision),current_timestamp
带有时区的
TIMEOFDAY
CURTIME()CURTIME([fsp])。fsp小数部分,0~6。
当前时间(不包括日期)。格式:‘hh:mm:ss’ , hhmmss
CURRENT_TIME,没有参数
DATE()DATE(expr)。返回日期部分。DATE
DATE_ADD()DATE_ADD(date,INTERVAL expr unit)。/
DATE_FORMAT()DATE_FORMAT(date,format)/
DATE_SUB()DATE_SUB(date,INTERVAL expr unit)/
DATEDIFF()返回date1和date2两个日期之间的天数days_between(date1,date2)
KES的这个返回值是带有小数部分的,不是整天
DAY()DAYOFMONTH()同义词通过extract抽取
DAYNAME()DAYNAME(date)。返回日期是周几的名称通过extract抽取
DAYOFMONTH()DAYOFMONTH(date)。返回日期的DAY部分通过extract抽取
DAYOFWEEK()DAYOFWEEK(date)。返回日期是周几的序号,1~7(周日到周六)通过extract抽取
DAYOFYEAR()返回日期是当前的第几天 (1-366)通过extract抽取
EXTRACT()抽取日期的指定部分EXTRACT(field FROM source)
FROM_DAYS()转换一个数字成date类型,366为0001-01-01。
FROM_UNIXTIME()Unix时间戳转日期。从1970-01-01开始,以秒为单位。会转换为本地时间。to_timestamp (double precision )
参数有差异
GET_FORMAT()获取格式化串。系统内部定义的格式串。/
HOUR()抽取时间部分通过extract抽取
LAST_DAYLAST_DAY(date)。某月最后一天。LAST_DAY
LOCALTIME(), LOCALTIMENOW()同义词LOCALTIME
LOCALTIMESTAMP, LOCALTIMESTAMP()NOW()同义词LOCALTIMESTAMP
MAKEDATE()构造日期。MYSQL 3个参数,KES 2个参数make_date(year int, month int, day int)
MAKETIME()从时,分,秒域创建时间。make_time(hour int, min int, sec double)
MICROSECOND()返回毫秒部分通过extract抽取
MINUTE()返回分钟部分通过extract抽取
MONTH()返回月份部分。1~12。month(datetime date)
MONTHNAME()返回月份名称通过extract抽取
NOW()获取当前时间。now()。KES不能指定精度
PERIOD_ADD()PERIOD_ADD(P,N)。P格式:YYMM 或者YYYYMM,N月数。给一个年月加上指定月份。/
PERIOD_DIFF()PERIOD_DIFF(P1,P2)。返回2个年月数据的月份差:P1-P2months_between,参数格式是不一样的
QUARTER()返回给定日期的季度。值为1~4。通过extract抽取
SEC_TO_TIME()转换给定秒数为TIME表示。 ‘hh:mm:ss’ 或hhmmss,没有前导0。
SECOND()返回秒 (0-59)通过extract抽取
STR_TO_DATE()STR_TO_DATE(str,format)。转换str到date。STR_TO_DATE
SUBDATE()SUBDATE(date,INTERVAL expr unit), SUBDATE(expr,days)。三个参数时,为DATE_SUB() 的同义词。/
SUBTIME()SUBTIME(expr1,expr2)。expr2是个time类型。/
SYSDATE()SYSDATE([fsp])。返回当前时间。SYSDATE()。不能指定精度
TIME()TIME(expr)。返回日期时间部分。
TIME_FORMAT()格式化时间。time_format(time,format),格式少一些。官网示例不能执行。
TIME_TO_SEC()时间转化为秒数。/
TIMEDIFF()TIMEDIFF(expr1,expr2)。expr1 − expr2。返回的是TIME类型。TIMESUB(head, tail) ,返回时间的秒级差。
TIMESTAMP()TIMESTAMP(expr), TIMESTAMP(expr1,expr2)。一个参数则返回一个datetime。2个参数则返回2个参数的和,第2个参数是time。
TIMESTAMPADD()TIMESTAMPADD(unit,interval,datetime_expr)
TIMESTAMPDIFF()TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)。datetime_expr2 − datetime_expr1
TO_DAYS()TO_DAYS(date)。返回给定日期从0000-01-01的天数。1582年之前的结果不可信。/
TO_SECONDS()TO_SECONDS(expr)。返回给定日期从0000-01-01的秒数。1582年之前的结果不可信。/
UNIX_TIMESTAMP()UNIX_TIMESTAMP([date])/
UTC_DATE()UTC_DATE, UTC_DATE()/
UTC_TIME()UTC_TIME, UTC_TIME([fsp])/
UTC_TIMESTAMP()UTC_TIMESTAMP, UTC_TIMESTAMP([fsp])/
WEEK()WEEK(date[,mode])。返回是当前的第几周。通过extract抽取
WEEKDAY()WEEKDAY(date)。返回是星期几。(0 = Monday, 1 = Tuesday, … 6 = Sunday)通过extract抽取
WEEKOFYEAR()WEEKOFYEAR(date)。返回是当年第几周。等同于WEEK(date,3)。通过extract抽取
YEAR()抽取日期的 年份 字段year(text)。KES只能是字符串
YEARWEEK()YEARWEEK(date), YEARWEEK(date,mode)/
/减去参数生成一个年、月不包含日的格式化结果。age(timestamp, timestamp)
SYSDATE返回当前日期和时间(在语句执行期间变化)clock_timestamp()
/获取时间子域。标准SQL:extractdate_part(text,timestamp)
date_part(text, interval)
/在某个精度截断时间。date_trunc(field, source [, time_zone ])
/判断传入时间是否为有限值isfinite(date)
/调整间隔,使30天时间段表示为月justify_days(interval)
/调整间隔,使24小时时间段表示为日 。justify_hours(interval)
/使用 justify_days justify_hours 调整间隔,并进行额外的符号调整justify_interval(interval)
/从年,月,周,日,时, 分, 秒域创建时间间隔。make_interval(years int default 0, months int default 0, weeks int default 0,days int default 0, hours int default 0, mins int default 0, secs double default 0.0)
/从年,月,日,时,分,秒域创建时间戳。make_timestamp(year int, month int, day int, hour int, min int, sec double)
从年,月,日,时,分,秒,时区域创建时间戳。make_timestamptz(year int, month int, day int, hour int, min int, sec double[, timezone text])
计算日期1与日期2的月份差。带小数months_between(date date1, date date2)
返回date四舍五入到格式模型指定的单位round(date)
返回当前会话的时区sessiontimezone

KES中的Date 是包含 日期和时间的。

MYSQL与KES中的时间部分的名字是不一样的。

SYSDATE()与NOW()区别

SYSDATE()与NOW()返回值一样。不同之处在于在同一个statement中的处理。NOW() 在同一个查询中,返回同一个值。SYSDATE()返回每次调用的值。

select a, now(),sleep(1),now()from (select '1' as a union all select '2' as a) u -- NOW()值一样。12022-09-07 16:29:1302022-09-07 16:29:1322022-09-07 16:29:1302022-09-07 16:29:13select a, sysdate(),sleep(1),sysdate()from (select '1' as a union all select '2' as a) u -- sysdate()值不一样。12022-09-07 16:30:1802022-09-07 16:30:1922022-09-07 16:30:1902022-09-07 16:30:20

字符串函数

Mysql参考: https://dev.mysql.com/doc/refman/8.0/en/string-functions.html , https://dev.mysql.com/doc/refman/8.0/en/regexp.html#function_regexp-instr

KES参考:http://help.kingbase.com.cn/v8/development/sql-plsql/sql/Function.html#id6

Mysql函数说明KES函数
ASCII()ASCII(str)。返回字符串左边字符的ASCII码。ASCII
BIN()返回整数的二进制表示,等同CONV(N,10,2)。/
BIT_LENGTH()返回字符串占多少位(bit)BIT_LENGTH
CHAR()CHAR(N,… [USING charset_name])。返回给定整数的char,连成一个字符串chr(int),只支持一个
CHAR_LENGTH()CHAR_LENGTH(str)。返回字符串有多少个字符,不考虑内部编码。char_length(string)
CHARACTER_LENGTH()CHAR_LENGTH()同义词character_length(string)
CONCAT()连接多个字符串。CONCAT
CONCAT_WS()CONCAT_WS(separator,str1,str2,…)。用指定分隔符连接多个字符串。concat_ws
ELT()ELT(N,str1,str2,str3,…)。返回指定index的字符串。/
EXPORT_SET()EXPORT_SET(bits,on,off[,separator[,number_of_bits]])。返回整数指各位的值。/
FIELD()FIELD(str,str1,str2,str3,…)。返回str的index。/
FIND_IN_SET()FIND_IN_SET(str,strlist)。/
FORMAT()FORMAT(X,D[,locale])KES与MYSQL同名但是作用不一样
FROM_BASE64()FROM_BASE64(str)decoding(‘MTIzMDAwMDAx’,‘base64’)
HEX()HEX(str), HEX(N)/
INSERT()INSERT(str,pos,len,newstr)/
INSTR()INSTR(str,substr)。与LOCALE(substr,str)一样。instr(expr1 text, expr2 text,[expr3 int[,expr4 int]])
LCASE()=LOWER()同义词LCASE
LEFT()LEFT(str,len)LEFT
LENGTH()LENGTH(str)。返回字符串占用的字节数。octet_length(string)
LIKE/
LOAD_FILE()LOAD_FILE(file_name)。/
LOCATE()LOCATE(substr,str), LOCATE(substr,str,pos)CHARINDEX
LOWER()转小写字符lower(string)
LPAD()LPAD(str,len,padstr)。给字符串str加前导padStr(指定长度)LPAD
LTRIM()移除左空格。LTRIM
MAKE_SET()MAKE_SET(bits,str1,str2,…)。bits参数用于决定选择那些字符串,以bits二进制位上是否为1来决定是否选择对应索引的字符串。/
MATCH()Perform full-text search
MID()MID(str,pos,len) 等同于 SUBSTRING(str,pos,len)。/
NOT LIKENegation of simple pattern matching
NOT REGEXPNegation of REGEXP
OCT()OCT(N),返回BIGINT型N的八进制字符串。/
OCTET_LENGTH()等同于LENGTH()octet_length(string)
ORD()ORD(str)。返回第一个字符的 ORD,如果是单字节字符,则返回ACSII。否则:(1st byte code)+ (2nd byte code * 256)+ (3rd byte code * 256^2) …/
POSITION()等同于 LOCATE()position(substring in string)
QUOTE()给字符串加单引号quote_ident
REGEXPWhether string matches regular expressionregexp_match
REGEXP_INSTR()REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])/
REGEXP_LIKE()REGEXP_LIKE(expr, pat[, match_type])/
REGEXP_REPLACE()REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])REGEXP_REPLACE
REGEXP_SUBSTR()REGEXP_SUBSTR(expr, pat[, pos[, occurrence[, match_type]]])/
REPEAT()REPEAT(str,count)。重复字符串n次。REPEAT
REPLACE()REPLACE(str,from_str,to_str)REPLACE
REVERSE()REVERSE(str)。反转字符串。REVERSE
RIGHT()RIGHT(str,len)。返回右边n个字符。RIGHT
RLIKEWhether string matches regular expression
RPAD()RPAD(str,len,padstr)。右边补充字符到len长度。
SELECT RPAD(‘hi’,5,‘?’),RPAD(‘hi’,1,‘?’);
OUTPUT:hi??? h
RPAD
RTRIM()RTRIM(str)。RTRIM
SOUNDEX()SOUNDEX(str)/
SOUNDS LIKEexpr1 SOUNDS LIKE expr2。等同于:SOUNDEX(expr1) = SOUNDEX(expr2)/
SPACE()SPACE(N)/
STRCMP()Compare two strings/
SUBSTR()等同于SUBSTRING()
SUBSTRING()SUBSTRING(str,pos), SUBSTRING(str FROM pos), SUBSTRING(str,pos,len), SUBSTRING(str FROM pos FOR len)SUBSTRING。位置的参数意义不同。
SUBSTRING_INDEX()SUBSTRING_INDEX(str,delim,count)。返回指定分隔符第count次出现之前的子串。count为负数时,从右边开始数,返回到字符串尾部的子串。
SELECT SUBSTRING_INDEX(‘www.mysql.com’, ‘.’, 2), SUBSTRING_INDEX(‘www.mysql.com’, ‘.’, -2);
OUTPUT:www.mysql mysql.com
/
TO_BASE64()TO_BASE64(str)encode(‘123000001’,‘base64’);
TRIM()TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str), TRIM([remstr FROM] str)BTRIM 部分等同于。
UCASE()等同于 UPPER()UCASE
UNHEX()UNHEX(str)。16进制转字符串。/
UPPER()UPPER
WEIGHT_STRING()WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [flags])/
/搜索文本内容contains(expr1 text,expr2 text [,label Numeric])
COLLATE语法把字符串转化为另一个编码形式的 字节表示convert(string bytea,src_encoding name,dest_encoding name)
/将字符串转换为数据库编码。返回stringconvert_from(string bytea, src_encoding name)
/将字符串 string 转换为 dest_encoding 指定的编码格式。返回stringconvert_to(string text,dest_encoding name)
从 string 中的文本表达解码二进制数据decoding(string text,format text)
将二进制数据 data 编码成一个文本表达。format 支持的格式有:base64 、 hex、escape。ENCODE
/根据一个格式字符串产生格式化的输出。类似于printfFORMAT
/首字母大写INITCAP
/查找字符串位置,以字节计数。INSTRB
OVERLAY
说明
  • SOUNDEX

    SOUNDEX()函数用于返回字符串的语音表示形式

  • WEIGHT_STRING

    WEIGHT_STRING()函数来查找字符串的权重。字符。该函数以二进制字符串形式返回表示重量的值。因此,我们需要使用 HEX(WEIGHT_STRING(str))函数以可打印的形式显示重量。

    权重主要用于比较字符。

    SELECT HEX(WEIGHT_STRING('AaBbCc' ) ) AS Weight;-- OUTPUT:004100410042004200430043SELECT HEX(WEIGHT_STRING(BINARY 'AaBbCc')) AS Weight;-- OUTPUT:416142624363

KES 的 SUBSTRING的实际执行结果与官网的示例结果是不一样的。

-- 官网示例SELECT SUBSTRING('ABCDEFG',-5,4) "Substring" FROM DUAL;+-----------+| Substring |+===========+| CDEF|+-----------+--实际结果 。应该是从左边偏移SELECTSUBSTRING('ABCDEFG',-3,4),SUBSTRING('ABCDEFG',-2,4),SUBSTRING('ABCDEFG',-1,4),SUBSTRING('ABCDEFG',0,4),SUBSTRING('ABCDEFG',1,4)'','A''AB''ABC''ABCD'

类型转换

CAST

MYSQL:

CAST(expr AS type [ARRAY])-- MYSQL8.0.22支持。CAST(timestamp_value AT TIME ZONE timezone_specifier AS DATETIME[(precision)])

KES:

CAST(expr AS type [ARRAY])
Convert

MYSQL:

CONVERT(expr USING transcoding_name)CONVERT(expr,type)

CONVERT(expr USING transcoding_name) 用于把数据转换为不同的字符集。

SELECT CONVERT('abc' USING utf8mb4);-- OUTPUTabcSELECT CONVERT(_latin1'Müller' USING utf8mb4);-- OUTPUT:Müller

KES:

CONVERT(expr,type)
数据类型的转换

CAST(expr AS type [ARRAY]) 等同于 CONVERT(expr,type)

把一个表达式转化为另一种数据类型。

type支持的类型:

  • BINARY[(N)]
  • CHAR[(N)] [charset_info]
  • DATE
  • DATETIME[(M)]
  • DECIMAL[(M[,D])]
  • DOUBLE
  • FLOAT[§]
  • JSON (mysql 8.0)
  • NCHAR[(N)]
  • REAL
  • SIGNED [INTEGER]
  • spatial_type(MySQL 8.0.24)
  • TIME[(M)]
  • UNSIGNED [INTEGER]
  • YEAR(MySQL 8.0.22)
  • AT TIME ZONE(MySQL 8.0.22)

位操作函数

参考:https://dev.mysql.com/doc/refman/8.0/en/bit-functions.html

MYSQLDescriptionKES
&Bitwise AND&,BITAND
>>Right shift>>
<<Left shift<<
^Bitwise XOR^
BIT_COUNT()返回二进制位被设置为1的位数。
[``](https://dev.mysql.com/doc/refman/8.0/en/bit-functions.html#operator_bitwise-or)Bitwise OR
~Bitwise inversion~
SELECT 127 | 128, 128 << 2, BIT_COUNT(15);-- OUTPUT:2555124 SELECT X'40' | X'01', b'11110001' & b'01001111'; -- OUTPUT: 6565 SELECT _binary X'40' | X'01', b'11110001' & _binary b'01001111'; -- OUTPUT:10 

在mysql 8.0之前,位操作符 仅支持 bigint,返回结果也是bigint。在mysql 8.0 之后,操作数支持二进制字符串((BINARY, VARBINARY, 和 BLOB ),返回值类型与操作符类型一致。

BIT_AND(), BIT_OR(), 和BIT_XOR() 是聚合函数,用于聚合多行记录的某列的值。

其他

Spring 集成

把官方的jar包上传到maven库

引入maven库

JDBC配置

代码

示例

数据库
Create table Test_All(id a tinyint NOT null default 0 ,b smallint NOT null default 0 ,c int NOT NULL default 0,d bigint NOT NULL default 0 ,e float(3)NOT NULL default 0,f double PRECISIONNOT NULL default 0,g date default current_timestamp ,h time ,i timestamp,j date withtime zone,k time withtime zone,l timestamp withtime zone,m char(8 byte) NOT NULL default '',n varchar(32 byte) NOT NULL default '',o bit(8) ,p boolean NOT NULL default false ,q MONEY NOT NULL default 0,u UUID NOT NULL default 0,v UUID NOT NULL default {00000000-0000-0000-0000-000000000000} ,)
Java bean

同时兼容mysql和KES,并支持切换

mybatis-plus兼容

boolean型属性

经验证,int 类型的1/0 会自动转换为boolean对应的true/false

update_date类型属性

附录

注意

官网上的文档有很多错误,一定要自己确认。

官网上的文档有很多错误,一定要自己确认。

官网上的文档有很多错误,一定要自己确认。

navicat连接KES

未找到相关资料

DBeaver连接KES

1、下载DBeaver:https://dbeaver.io/download/ 。下载windows版本。

2、安装

3、下载KES的驱动:

吐槽:人大金仓官网居然没有。

在安装目录下的 /KESRealPro/V008R006C006B0013/Interface/jdbc 下有。

4、在DBeaver中创建连接

  • 创建驱动

驱动信息:

com.kingbase8.Driverjdbc:kingbase8://{host}[:{port}]/[{database}]

命令行

在安装根目录的 ./KESRealPro/V008R006C006B0013/ClientTools/bin 下有ksql 文件。需要加入到PATH中才可以直接访问。

Usage:ksql [OPTION]... [DBNAME [USERNAME]]General options:-c, --command=COMMANDrun only single command (SQL or internal) and exit-d, --dbname=DBNAMEdatabase name to connect to (default: "root")-f, --file=FILENAMEexecute commands from file, then exit-l, --list list available databases, then exit-v, --set=, --variable=NAME=VALUE set ksql variable NAME to VALUE (e.g., -v ON_ERROR_STOP=1)-V, --versionoutput version information, then exit-X, --no-ksqlrcdo not read startup file (~/.ksqlrc)-1 ("one"), --single-transaction execute as a single transaction (if non-interactive)-" />[=options] show this help, then exit--help=commandslist backslash commands, then exit--help=variables list special variables, then exitInput and output options:-a, --echo-all echo all input from script-b, --echo-errorsecho failed commands-e, --echo-queries echo commands sent to server-E, --echo-hiddendisplay queries that internal commands generate-L, --log-file=FILENAMEsend session log to file-n, --no-readlinedisable enhanced command line editing (readline)-o, --output=FILENAMEsend query results to file (or |pipe)-q, --quietrun quietly (no messages, only query output)-s, --single-stepsingle-step mode (confirm each query)-S, --single-linesingle-line mode (end of line terminates SQL command)Output format options:-A, --no-align unaligned table output mode--csvCSV (Comma-Separated Values) table output mode-F, --field-separator=STRING field separator for unaligned output (default: "|")-H, --html HTML table output mode-P, --pset=VAR[=ARG] set printing option VAR to ARG (see \pset command)-R, --record-separator=STRING record separator for unaligned output (default: newline)-t, --tuples-onlyprint rows only-T, --table-attr=TEXTset HTML table tag attributes (e.g., width, border)-x, --expanded turn on expanded table output-z, --field-separator-zero set field separator for unaligned output to zero byte-0, --record-separator-zero set record separator for unaligned output to zero byteConnection options:-h, --host=HOSTNAMEdatabase server host or socket directory (default: "local socket")-p, --port=PORTdatabase server port (default: "54321")-U, --username=USERNAMEdatabase user name (default: "root")-w, --no-passwordnever prompt for password-W, --password force password prompt (should happen automatically)

参考:http://help.kingbase.com.cn/v8/admin/reference/ref-ksql/ksql-3.html?highlight=ksql

示例

#登录数据库(必须要指定连接数据库)./ksql -h localhost -p 54321 -U system -Wtest#带有密码的,必须不能带-h 参数。 并且 数据库的参数必须在 -w 之前。./ksqltest -p 54321 -U system -w 123456 ./ksql -p 54321 -U systemtest-w 123456 #执行脚本命令./ksqltest -p 54321 -U system -w 123456 -c 'select 1;'

数据库结构迁移

问题

mysql中的表名和字段都是小写的,迁移后发现数据都已经迁移过来。但是点击权限的时候,提示关系‘表名’不存在。

使用kingbase自带的数据库迁移工具进行迁移,迁移时需要注意,如果mysql数据库中的表和字段是小写的话需要,在迁移的时候,点击配置选择表和字段大写,才能正常迁移,不然迁移后提示关系‘表名’不存在。

疑问

ksql 登录时为什么带 -h 就不能在参数中带上密码。那怎么连接其他机器上的数据库

mysql表的DDL语句能否自动转化为KES的DDL语句。

能够设置 类似mysql ON UPDATE CURRENT_TIMESTAMP,修改列时自动更新字段的值?