人大金仓数据库与mysql比较
简介
人大金仓数据库是基于 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 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,空间数据等处理函数肯定是不一样的,参考官方文档。
控制流函数
函数 | 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: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 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: 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
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 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中创建连接
- 创建驱动
驱动信息:
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
,修改列时自动更新字段的值?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!