人大金仓数据库与mysql比较

发布时间:2024年01月02日

简介

人大金仓数据库是基于 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

创建表

-- 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:

-- 通过 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,
    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:

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

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

KES:

-- 字段约束
CREATE TABLE distributors (
    did     integer,
    name    varchar(40) UNIQUE
);        

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

MYSQL:

-- 字段约束
CREATE TABLE distributors (
    did     integer,
    name    varchar(40) UNIQUE
);        

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

通过约束可以创建索引

注释

MYSQL:

-- 加在表定义以及列定义后面
comment 'this is a comment'

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

KES:

-- 表加注释
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:

  `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 AS
  SELECT * FROM films WHERE date_prod >= '2002-01-01';

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=%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上的索引名称可以相同。

修改表

-- KES
ALTER 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_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:

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()值一样。
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.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:
    004100410042004200430043
    
    SELECT HEX(WEIGHT_STRING(BINARY 'AaBbCc')) AS Weight;
    -- OUTPUT:
    416142624363
    

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

-- 官网示例
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:

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);
-- OUTPUT
abc

SELECT 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:
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配置

代码

示例

数据库
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类型属性

附录

注意

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

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

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

navicat连接KES

未找到相关资料

DBeaver连接KES

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

2、安装

3、下载KES的驱动:

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

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

4、在DBeaver中创建连接

  • 创建驱动
image-20221025134351461 image-20221025134454941 image-20221025135547764

image-20221025144036750

驱动信息:

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

命令行

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

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

示例

#登录数据库(必须要指定连接数据库)
./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,修改列时自动更新字段的值?

文章来源:https://blog.csdn.net/demon7552003/article/details/135322674
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。