简介
人大金仓数据库是基于 PostgreSQL 开发的。
SQL语言
语法
关键字
KES:
MYSQL:
语句
* | 特性 | MYSQL | KES |
---|---|---|---|
字符串字面量 | 单引号(' )或 双引号(" ) | ' | |
十六进制字面量 | 0x5461626c65 ,X'5461626c65' | / | |
BIT字面量 | b'1000001' ,0b1000001 | / | |
Boolean字面量 | 常数TRUE 和FALSE 分别取值为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=%E8%BF%90%E7%AE%97%E7%AC%A6
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
创建表
-- 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 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上的索引名称可以相同。
修改表
-- 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_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,空间数据等处理函数肯定是不一样的,参考官方文档。
控制流函数
函数 | 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()返回每次调用的值。
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:13select 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 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))函数以可打印的形式显示重量。
权重主要用于比较字符。
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 | +-----------+-- 实际结果 。应该是从左边偏移 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
abcSELECT 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
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 | ~ |
SELECT 127 | 128, 128 << 2, BIT_COUNT(15);
-- OUTPUT:
255 512 4SELECT X'40' | X'01', b'11110001' & b'01001111';-- OUTPUT:65 65SELECT _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中创建连接
- 创建驱动
驱动信息:
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=VALUEset 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-transactionexecute 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 exitInput 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=STRINGfield 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=STRINGrecord 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-zeroset field separator for unaligned output to zero byte-0, --record-separator-zeroset record separator for unaligned output to zero byteConnection 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
,修改列时自动更新字段的值?