因手上的某项目需要迁至政务云,全面采用国产化软件。这里记录一下将Mysql迁至人大金仓数据库V8R6(是指V008R006C009B0014版本,不同版本区别较大)版本的一些不兼容及其它记录。以下内容有部分是来源于网络收集,并未经过本人验证;部分为本人使用遇到的,是否通用未知。
一、函数差异:
MySQL中的sysdate()函数在金仓数据库中不存在,可以使用current_timestamp()替换。
MySQL中的STR_TO_DATE函数在金仓数据库中不存在,可以使用to_date(n, format)替换。
MySQL中的UUID()函数在金仓数据库中可以通过SYS_GUID()替换。
日期计算方面,MySQL中的now() + interval -1 day需要改为金仓数据库的now() – interval ‘1’ day 或 DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL ‘1’ DAY)。
二、SQL语法差异:
MySQL中查询使用双引号在金仓数据库中不支持,需改为单引号。
MySQL中的GROUP BY语句在返回其他非聚合字段时,不需要对这些字段使用函数括起来,但在金仓数据库中需要,否则可能报错。这个问题可以通过配置金仓数据库解决。
MySQL中的INNER JOIN在金仓数据库中可能需要改为使用逗号关联(但左连接和右连接通常没问题)。
MySQL中的某些隐式类型转换在金仓数据库中可能不支持,需要手动使用CAST()函数进行转换。
三、特定功能或配置:
MySQL中的某些SQL模式(如ONLY_FULL_GROUP_BY)在金仓数据库中可能不支持或需要不同的配置方式。
金仓数据库客户端的安装地址不能包含空格,否则可能导致部分指令执行报错。
某些第三方工具或框架(如Activiti工作流5.22版本)可能不支持金仓数据库。
金仓数据库在兼容MySQL时,可能还存在其他细微的差别,如字符串包裹方式、正则表达式等方面的差异。
四、数据类型和格式:
MySQL中的日期格式函数(如DATE_FORMAT)在金仓数据库中可能需要使用不同的函数(如TO_CHAR)进行替换。
MySQL中的IFNULL函数在金仓数据库中可以通过NVL函数替换。
MySQL中的SERIAL自增主键可能与金仓数据库中的原有数据存在冲突。
五、其他:
1、group by字段检测模式:show sql_mode; //查看配置
alter SYSTEM SET sql_mode = ‘ANSI_QUOTES’; //去掉ONLY_FULL_GROUP_BY,alter SYSTEM 修改全局配置
SELECT sys_reload_conf(); 更新配置生效
2、字段类型隐式转换 人大金仓不会自动转换类型,需要cast()手动转换 否则报invalid input syntax for type XX
3、join后必须带on select * from a left join b on 1 =1
4、()中文括号会影响语法判断报 syntax error at or near ….
5、activiti工作流5.22版本不支持人大金仓数据库couldn’t deduct database type from database product name ‘KingbaseES’ 参考https://www.cnblogs.com/montaro/p/17956719 不更改版本和源码适配人大金仓
6、与mysql函数冲突 mysql: DATE_SUB(CURDATE(), INTERVAL 1 MONTH) 人大金仓:DATE_SUB(CURDATE(), INTERVAL ‘1’ MONTH)
7、人大金仓客户端安装地址不能有空格,比如c:/program file,否则部分指令执行报错
8、mybats和人大金仓关键字level冲突,报CONNECT BY clause required in this query block, 使用@TableField(“”level””)解决
9、serial自增主键和和原有数据冲突
10、详细示例: 10.1、mysql中查询中如果使用双引号,在人大金仓数据库中不支持,需改为单引号 例如:select 字段A,字段B,字段C from tableA where 字段A = “1” 改为:select 字段A,字段B,字段C from tableA where 字段A = ‘1’
10.2、MySQL中使用group by 字段A,然后也会返回其他字段 字段A,字段B,字段C,其他字段也要使用函数括起来, 例如:select 字段A,字段B,字段C from tableA group by 字段A 改为:select 字段A,max(字段B) as 字段B,max(字段C) as 字段C from tableA group by 字段A 否则会报错,这个问题可以通过配置(配置后续补充)人大金仓数据库解决
10.3、mysql中使用inner join的,要去掉改为使用逗号关联(注:左连接和右连接没问题) 例如:select a.* from tableA a inner join tableB b on a.字段1 = b.字段1 改为:select a.* from tableA a, tableB b where a.字段1 = b.字段1 10.4、mysql的UUID()函数在人大金仓数据库中不支持
收集来源:https://blog.csdn.net/NN2016160626/article/details/135556355
收集来源1: https://www.jianshu.com/p/1f8b8b76d00b
收集来源:百度AI-> 金仓数据库与MySQL不兼容列表