人大金仓数据库与mysql比较

简介

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

SQL语言

语法

关键字

KES:

MYSQL:

语句

* 特性 MYSQL KES
字符串字面量 单引号(')或 双引号(") '
十六进制字面量 0x5461626c65X'5461626c65' /
BIT字面量 b'1000001',0b1000001 /
Boolean字面量 常数TRUEFALSE分别取值为1和0。 true/false/null
字符串内单引号转义 'Don\'t' 'Don''t'
字段引起来 反引号 双引号 "Col"
转义字符 \ 不需要转义,单引号内
运算符
特性 MYSQL KES
除法 /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=运算符

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

数据类型

分类 类型 Mysql KES 差异
整数 tintyint tintyint tinyint KES不能是无符号的
smallint smallint smallint KES不能是无符号的
mediumint mediumint middleint mediumint int3 不建议使用
int int INTEGER/INT KES不能是无符号的
bigint bigint BIGINT KES不能是无符号的
小数 单精度 float REAL / FLOAT§ 当fload的p取值为 1-24 时,与 REAL 相同。取值范围不一致。
双精度 double DOUBLE 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类型是包括日期和时间的
仅时间 time TIME KES的是可以带时区的
年份 year /
日期加时间 datetime DATE
时间戳 timestamp TIMESTAMP KES的是可以区分标准时区与本地时区
间隔 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,longtext TEXT MYSQL:限制为2^32 - 1 KES:限制为1G(2^30)
大对象类型 变长的二进制大对象 / BLOB MYSQL中BLOB的长度限制为65535。 KES最大为1G。
变长字符大对象 / CLOB KES:最大为1G。
变长字符大对象 / NCLOB KES:最大为1G。unicode编码
位类型 定长位类型 bit BIT[(n)]
变长位类型 / BIT VAYRING(n)
定长二进制 binary(n) /
变长二进制串 varbinary(n) BYTEA MYSQL:最大4G。 KES:变长二进制串, 长度最大为 1G
布尔类型 / Boolean Mysql用 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

创建表

sql 复制代码
-- KES
CREATE   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:

mysql 复制代码
-- 通过 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:

mysql 复制代码
CREATE TABLE cinemas (
        id int auto_increment,  
        name text,
        location text
) 
主键

KES:

sql 复制代码
-- 列约束
 
CREATE TABLE distributors (
    did     integer CONSTRAINT firstkey PRIMARY KEY,
    name    varchar(40)
);

CREATE TABLE distributors (
    did     integer PRIMARY KEY,
    name    varchar(40)
);

-- 表约束
CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    PRIMARY KEY(did)
);

MYSQL:

mysql 复制代码
CREATE TABLE distributors (
    did     integer PRIMARY KEY,
    name    varchar(40)
);

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

KES:

sql 复制代码
-- 字段约束
CREATE TABLE distributors (
    did     integer,
    name    varchar(40) UNIQUE
);        

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

MYSQL:

mysql 复制代码
-- 字段约束
CREATE TABLE distributors (
    did     integer,
    name    varchar(40) UNIQUE
);        

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

通过约束可以创建索引

注释

MYSQL:

sql 复制代码
-- 加在表定义以及列定义后面
comment 'this is a comment'

-- 没有专门命令删除comment。

KES:

sql 复制代码
-- 表加注释
Comment on  table [tablename] IS  '表注释'
-- 列加注释
Comment on  column  [tablename].ColumnName  IS  '列注释'

-- 删除表注释
Comment on  table [tablename] IS  NULL
-- 删除列注释
Comment on  column  [tablename].ColumnName  IS  NULL
自动更新修改时间

MYSQL:

sql 复制代码
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_update` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

KES:

sql 复制代码
 modtime   timestamp DEFAULT current_timestamp    -- 插入时的默认值

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

分区

不一致。略。

通过一个查询创建表

KES:

sql 复制代码
CREATE TABLE films_recent AS
  SELECT * FROM films WHERE date_prod >= '2002-01-01';

MYSQL:

mysql 复制代码
CREATE TABLE films_recent AS
  SELECT * FROM films WHERE date_prod >= '2002-01-01';

索引

创建索引

KES参考:http://help.kingbase.com.cn/v8/admin/general/administrator-guide/14-managing-indexes.html?highlight=索引

KES:

sql 复制代码
-- 显式地创建索引
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:

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

MYSQL:

mysql 复制代码
DROP INDEX index_name ON tbl_name

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

修改表

mysql 复制代码
-- KES
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
    action [, ... ]

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

另外不建议使用后代表。

新增列

KES:

sql 复制代码
    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:

mysql 复制代码
  ADD [COLUMN] col_name column_definition         [FIRST | AFTER col_name]
  DROP [COLUMN] col_name
  ALTER [COLUMN] col_name .......
  MODIFY [COLUMN] col_name column_definition         [FIRST | AFTER col_name]
  RENAME COLUMN old_col_name TO new_col_name

MYSQL修改列方式更复杂。

修改列类型

KES:

sql 复制代码
ALTER [ COLUMN ] column_name ...

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

KES:

mysql 复制代码
DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]

MYSQL:

mysql 复制代码
DROP [COLUMN] col_name

删除表

兼容。略。

创建序列

sql 复制代码
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 } ]
sql 复制代码
-- 创建一个序列 (一般对应mysql 的auto_increatment)
CREATE SEQUENCE serial_A START 1;
-- 使用一个序列
select nextval('serial_A')

序列是基于bigint的。

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

删除序列

KES:

mysql 复制代码
DROP SEQUENCE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

MYSQL:

不涉及

函数

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

控制流函数

函数 MYSQL KES
CASE CASE 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)
相等则返回null NULLIF(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 cosine acos(n)
ASIN() arc sine asin(n)
ATAN() arc tangent atan(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,-1 sign({dp|numeric})
SIN() sin sin({dp|numeric})
SQRT() 返回平方根。负数返回null。 sqrt(n)
TAN() tan TAN(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_DAY LAST_DAY(date)。某月最后一天。 LAST_DAY
LOCALTIME(), LOCALTIME NOW()同义词 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-P2 months_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:extract date_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()返回每次调用的值。

mysql 复制代码
select a  , now(),sleep(1),now()
from (
select '1' as a union all select '2' as a
) u 

-- NOW()值一样。
1	2022-09-07 16:29:13	0	2022-09-07 16:29:13
2	2022-09-07 16:29:13	0	2022-09-07 16:29:13

select a  , sysdate(),sleep(1),sysdate()
from (
select '1' as a union all select '2' as a
) u 
-- sysdate()值不一样。
1	2022-09-07 16:30:18	0	2022-09-07 16:30:19
2	2022-09-07 16:30:19	0	2022-09-07 16:30:20

字符串函数

Mysql参考: https://dev.mysql.com/doc/refman/8.0/en/string-functions.htmlhttps://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 LIKE Negation of simple pattern matching
NOT REGEXP Negation 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
REGEXP Whether string matches regular expression regexp_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
RLIKE Whether 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 LIKE expr1 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)
/ 将字符串转换为数据库编码。返回string convert_from(string bytea, src_encoding name)
/ 将字符串 string 转换为 dest_encoding 指定的编码格式。返回string convert_to(string text,dest_encoding name)
从 string 中的文本表达解码二进制数据 decoding(string text,format text)
将二进制数据 data 编码成一个文本表达。format 支持的格式有:base64 、 hex、escape。 ENCODE
/ 根据一个格式字符串产生格式化的输出。类似于printf FORMAT
/ 首字母大写 INITCAP
/ 查找字符串位置,以字节计数。 INSTRB
OVERLAY
说明
  • SOUNDEX

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

  • WEIGHT_STRING

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

    权重主要用于比较字符。

    mysql 复制代码
    SELECT HEX(WEIGHT_STRING('AaBbCc' ) ) AS Weight;
    -- OUTPUT:
    004100410042004200430043
    
    SELECT HEX(WEIGHT_STRING(BINARY 'AaBbCc')) AS Weight;
    -- OUTPUT:
    416142624363

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

sql 复制代码
-- 官网示例
SELECT SUBSTRING('ABCDEFG',-5,4) "Substring" FROM DUAL;

+-----------+
| Substring |
+===========+
| CDEF      |
+-----------+

--  实际结果 。应该是从左边偏移
SELECT  SUBSTRING('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:

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:

mysql 复制代码
CONVERT(expr USING transcoding_name)
CONVERT(expr,type)

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

mysql 复制代码
SELECT CONVERT('abc' USING utf8mb4);
-- OUTPUT
abc

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

KES:

mysql 复制代码
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

MYSQL Description KES
& 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 ~
mysql 复制代码
SELECT 127 | 128, 128 << 2, BIT_COUNT(15);
-- OUTPUT:
255	512	4

 SELECT X'40' | X'01', b'11110001' & b'01001111';
 -- OUTPUT:
 65	65
 
  SELECT _binary X'40' | X'01', b'11110001' & _binary b'01001111';
   -- OUTPUT:
  1	0 

在mysql 8.0之前,位操作符 仅支持 bigint,返回结果也是bigint。在mysql 8.0 之后,操作数支持二进制字符串((BINARY, VARBINARY, 和 BLOB ),返回值类型与操作符类型一致。
BIT_AND(), BIT_OR(), 和BIT_XOR() 是聚合函数,用于聚合多行记录的某列的值。

其他

Spring 集成

把官方的jar包上传到maven库

引入maven库

JDBC配置

代码

示例

数据库
sql 复制代码
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 PRECISION  NOT NULL default 0,
    g date default current_timestamp ,
    h time ,
    i timestamp,
    j date with  time zone,
    k time with  time zone,
    l timestamp with  time 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类型属性

附录

注意

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

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

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

未找到相关资料

DBeaver连接KES

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

2、安装

3、下载KES的驱动:

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

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

4、在DBeaver中创建连接

  • 创建驱动

驱动信息:

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

命令行

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

shell 复制代码
Usage:
  ksql [OPTION]... [DBNAME [USERNAME]]

General options:
  -c, --command=COMMAND    run only single command (SQL or internal) and exit
  -d, --dbname=DBNAME      database name to connect to (default: "root")
  -f, --file=FILENAME      execute 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, --version            output version information, then exit
  -X, --no-ksqlrc          do not read startup file (~/.ksqlrc)
  -1 ("one"), --single-transaction
                           execute as a single transaction (if non-interactive)
  -?, --help[=options]     show this help, then exit
      --help=commands      list backslash commands, then exit
      --help=variables     list special variables, then exit

Input and output options:
  -a, --echo-all           echo all input from script
  -b, --echo-errors        echo failed commands
  -e, --echo-queries       echo commands sent to server
  -E, --echo-hidden        display queries that internal commands generate
  -L, --log-file=FILENAME  send session log to file
  -n, --no-readline        disable enhanced command line editing (readline)
  -o, --output=FILENAME    send query results to file (or |pipe)
  -q, --quiet              run quietly (no messages, only query output)
  -s, --single-step        single-step mode (confirm each query)
  -S, --single-line        single-line mode (end of line terminates SQL command)

Output format options:
  -A, --no-align           unaligned table output mode
      --csv                CSV (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-only        print rows only
  -T, --table-attr=TEXT    set 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 byte

Connection options:
  -h, --host=HOSTNAME      database server host or socket directory (default: "local socket")
  -p, --port=PORT          database server port (default: "54321")
  -U, --username=USERNAME  database user name (default: "root")
  -w, --no-password        never 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

示例

shell 复制代码
#登录数据库(必须要指定连接数据库)
./ksql -h localhost -p 54321 -U system -W  test

#带有密码的,必须不能带-h 参数。 并且 数据库的参数必须在 -w 之前。
./ksql  test -p 54321 -U system   -w 123456 
./ksql   -p 54321 -U system  test  -w 123456 

#执行脚本命令
./ksql  test -p 54321 -U system   -w 123456 -c 'select 1;'

数据库结构迁移

问题

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

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

疑问

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

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

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

相关推荐
打鱼又晒网15 分钟前
【MySQL】数据库精细化讲解:内置函数知识穿透与深度学习解析
数据库·mysql
大白要努力!20 分钟前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
tatasix1 小时前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。1 小时前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了1 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度1 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮1 小时前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9992 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️2 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98763 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发