人大金仓数据库与mysql比较

简介

人大金仓数据库是基于 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 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,空间数据等处理函数肯定是不一样的,参考官方文档。

控制流函数

函数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: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 LIKENegation of simple pattern matching
NOT REGEXPNegation of REGEXP
OCT()OCT(N),返回BIGINT型N的八进制字符串。/
OCTET_LENGTH()等同于LENGTH()octet_length(string)
ORD()ORD(str)。返回第一个字符的 ORD,如果是单字节字符,则返回ACSII。否则:(1st byte code)+ (2nd byte code * 256)+ (3rd byte code * 256^2) …/
POSITION()等同于 LOCATE()position(substring in string)
QUOTE()给字符串加单引号quote_ident
REGEXPWhether string matches regular expressionregexp_match
REGEXP_INSTR()REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])/
REGEXP_LIKE()REGEXP_LIKE(expr, pat[, match_type])/
REGEXP_REPLACE()REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])REGEXP_REPLACE
REGEXP_SUBSTR()REGEXP_SUBSTR(expr, pat[, pos[, occurrence[, match_type]]])/
REPEAT()REPEAT(str,count)。重复字符串n次。REPEAT
REPLACE()REPLACE(str,from_str,to_str)REPLACE
REVERSE()REVERSE(str)。反转字符串。REVERSE
RIGHT()RIGHT(str,len)。返回右边n个字符。RIGHT
RLIKEWhether string matches regular expression
RPAD()RPAD(str,len,padstr)。右边补充字符到len长度。
SELECT RPAD(‘hi’,5,‘?’),RPAD(‘hi’,1,‘?’);
OUTPUT:hi??? h
RPAD
RTRIM()RTRIM(str)。RTRIM
SOUNDEX()SOUNDEX(str)/
SOUNDS LIKEexpr1 SOUNDS LIKE expr2。等同于:SOUNDEX(expr1) = SOUNDEX(expr2)/
SPACE()SPACE(N)/
STRCMP()Compare two strings/
SUBSTR()等同于SUBSTRING()
SUBSTRING()SUBSTRING(str,pos), SUBSTRING(str FROM pos), SUBSTRING(str,pos,len), SUBSTRING(str FROM pos FOR len)SUBSTRING。位置的参数意义不同。
SUBSTRING_INDEX()SUBSTRING_INDEX(str,delim,count)。返回指定分隔符第count次出现之前的子串。count为负数时,从右边开始数,返回到字符串尾部的子串。
SELECT SUBSTRING_INDEX(‘www.mysql.com’, ‘.’, 2), SUBSTRING_INDEX(‘www.mysql.com’, ‘.’, -2);
OUTPUT:www.mysql mysql.com
/
TO_BASE64()TO_BASE64(str)encode(‘123000001’,‘base64’);
TRIM()TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str), TRIM([remstr FROM] str)BTRIM 部分等同于。
UCASE()等同于 UPPER()UCASE
UNHEX()UNHEX(str)。16进制转字符串。/
UPPER()UPPER
WEIGHT_STRING()WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [flags])/
/搜索文本内容contains(expr1 text,expr2 text [,label Numeric])
COLLATE语法把字符串转化为另一个编码形式的 字节表示convert(string bytea,src_encoding name,dest_encoding name)
/将字符串转换为数据库编码。返回stringconvert_from(string bytea, src_encoding name)
/将字符串 string 转换为 dest_encoding 指定的编码格式。返回stringconvert_to(string text,dest_encoding name)
从 string 中的文本表达解码二进制数据decoding(string text,format text)
将二进制数据 data 编码成一个文本表达。format 支持的格式有:base64 、 hex、escape。ENCODE
/根据一个格式字符串产生格式化的输出。类似于printfFORMAT
/首字母大写INITCAP
/查找字符串位置,以字节计数。INSTRB
OVERLAY
说明
  • SOUNDEX

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

  • WEIGHT_STRING

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

    权重主要用于比较字符。

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

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

-- 官网示例
SELECT SUBSTRING('ABCDEFG',-5,4) "Substring" FROM DUAL;+-----------+
| Substring |
+===========+
| CDEF      |
+-----------+--  实际结果 。应该是从左边偏移
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

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	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中创建连接

  • 创建驱动
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=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,修改列时自动更新字段的值?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/591797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#中汉字转区位码

目录 一、关于区位码 1.区位码定义 2.算法 二、实例 三、生成效果 四、程序中的知识点 1.byte[] GetBytes(string s) 2.字节数组转short类型 一、关于区位码 1.区位码定义 区位码是一个4位的十进制数&#xff0c;每个区位码都对应着一个唯一的汉字&#xff0c;区位码…

软件测试方法分类-按照开发阶段划分细讲

前面我给出了整体的软件测试分类&#xff0c;那么接下来&#xff0c;我会将每个分类进行细讲。 第一个我们要说到的就是按照开发阶段划分。 我们都知道软件测试方法分类中&#xff0c;如果按照开发阶段划分&#xff0c;可以分为&#xff1a; 1&#xff0c;单元测试 (Unit Te…

androidStudio 没有新建flutter工程的入口?

装了flutter dart 插件 执行了 flutter doctor 也执行了 flutter doctor --android-license 最后重启了 androidStudio 还是没发现在哪新建flutter项目工程 原来 plugins 下的 Android APK Support没有勾选

鸿蒙崛起:互联网大厂加速鸿蒙原生应用开发,人才争夺战打响

随着华为鸿蒙系统的发布和不断推进&#xff0c;一场以鸿蒙为中心的生态竞争已经拉开帷幕。近日&#xff0c;网易、美团等多家互联网公司发布了与鸿蒙系统有关的岗位招聘&#xff0c;加速推进鸿蒙原生应用开发转型。这种趋势表明&#xff0c;鸿蒙系统已经引起了行业的广泛关注&a…

【Unity引擎技术整合】 Unity学习路线 | 知识汇总 | 持续更新 | 保持乐趣 | 共同成长

前言 本文对Unity引擎的知识进行了一个整理总结&#xff0c;基本包含了Unity中大部分的知识介绍。网上也有很多Unity相关的学习资料&#xff0c;但大多数都不成体系&#xff0c;学起来的时候难免会东奔西走的摸不着头脑。本文整理的多数文章都是有对应的系列性文章专栏&#x…

如何修改Anaconda的Jupyter notebook的默认启动路径

1.打开Anaconda控制台 2.输入下面的命令 jupyter notebook --generate-config 这个命令的作用是生成 Jupyter notebook 的配置文件。如果你是第一次运行&#xff0c;会直接生成这个文件。如果曾经运行过这个命令&#xff0c;就会像下图一样问你时候要覆盖原来的文件。这个时候…

听GPT 讲Rust源代码--compiler(2)

File: rust/compiler/rustc_codegen_cranelift/build_system/prepare.rs 在Rust源代码中&#xff0c;rust/compiler/rustc_codegen_cranelift/build_system/prepare.rs文件的作用是为Cranelift代码生成器构建系统准备依赖项。 具体来说&#xff0c;该文件的主要目标是处理Crane…

C语言注意点(2)

1.使用pow函数的相关问题 局部变量n0 while(num/pow(10,n)) n; 为什么不可行 printf("%d",num/pow(10,4)%10) 为什么要提前用temp先引出来 答&#xff1a;pow函数的返回值为double类型&#xff0c;1.终止条件不会满足 2.num/pow(10,4)结果为浮点型&#xff0c;浮…

为即将到来的量子攻击做好准备的 4 个步骤

当谈到网络和技术领域时&#xff0c;一场风暴正在酝酿——这场风暴有可能摧毁我们数字安全的根本结构。这场风暴被称为 Q-Day&#xff0c;是即将到来的量子计算时代的简写&#xff0c;届时量子计算机的功能将使最复杂的加密算法变得过时。 这场量子革命正以惊人的速度到来&am…

如何使用Node.js快速创建本地HTTP服务器并实现公网访问服务端

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

三、C语言中的分支与循环—while循环 (5)

本章分支结构的学习内容如下&#xff1a; 三、C语言中的分支与循环—if语句 (1) 三、C语言中的分支与循环—关系操作符 (2) 三、C语言中的分支与循环—条件操作符 与逻辑操作符(3) 三、C语言中的分支与循环—switch语句&#xff08;4&#xff09;分支结构 完 本章循环结…

2023年郑州轻工业大学软件学院数据结构实验五-查找与排序(详解+源码C语言版+运行结果)

实验要求 一、实验目的 1&#xff0e;掌握常用的查找和排序算法思想&#xff1b; 2&#xff0e;能够用所学过的查找和排序算法解决生活中的实际应用问题。 二、课程目标 支撑课程目标&#xff08;4&#xff09;&#xff1a;能够在软件开发过程中&#xff0c;针对特定需求综…

Nginx 代理静态资源,解决跨域问题

&#x1f602; 背景&#xff1a;移动端 H5 项目&#xff0c;依赖了一个外部的 JS 文件。访问时&#xff0c;出现跨域&#xff0c;导致请求被 block。 当前域名&#xff1a;https://tmcopss.test.com要访问的 JS 文件&#xff1a;https://tm.test.com/public/scripts/y-jssdk.j…

漏洞复现-海康威视网络对讲广播系统远程命令执行漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

基于Java (spring-boot)的在线培训考试系统

一、项目介绍 在线培训系统是一款基于SpringBootVue开发的考试系统。一款多角色在线培训考试系统&#xff0c;系统集成了用户管理、角色管理、部门管理、题库管理、试题管理、试题导入导出、考试管理、在线考试、错题训练等功能&#xff0c;考试流程完善。 多角色&#xff1a;多…

基于蝴蝶算法优化的Elman神经网络数据预测 - 附代码

基于蝴蝶算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于蝴蝶算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于蝴蝶优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针…

100天精通Python(实用脚本篇)——第111天:批量将PDF转Word文档(附上脚本代码)

文章目录 专栏导读1. 将PDF转Word文档需求2. 模块安装3. 模块介绍4. 注意事项5. 完整代码实现6. 运行结果书籍推荐 专栏导读 &#x1f525;&#x1f525;本文已收录于《100天精通Python从入门到就业》&#xff1a;本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教…

GRU算法

前置知识&#xff1a;RNN&#xff0c;LSTM LSTM需要训练的参数很多&#xff0c;极消耗计算资源。GRU是一种LSTM的改进算法&#xff0c;参数更少&#xff0c;更容易训练。 它将忘记门和输入门合并成为一个单一的更新门&#xff0c;同时合并了数据单元状态和隐藏状态&#xff0…

CSS 缩减顶部动画

<template><!-- mouseenter"startAnimation" 表示在鼠标进入元素时触发 startAnimation 方法。mouseleave"stopAnimation" 表示在鼠标离开元素时触发 stopAnimation 方法。 --><!-- 容器元素 --><div class"container" mou…

MATLAB指令

01--根据数学公式进行绘制 1.绘制连续函数 ①一元函数 t0:0.1:10; y3*t2; plot(t,y) ②一元二次函数 t0:0.1:10; yt.*t; plot(t,y) 注意此处应为点乘 ③一元3次 t0:0.1:10; yt.*t.*t; plot(t,y) ④y1/t t0:0.1:10; y1./t; plot(t,y) ⑤yexp(t) t0:0.1:10; yexp(2*t); p…