达梦适配MySQL你踩了多少个坑?

DBC 299 0

1、报错:试图在blob或者clob列上排序或比较

解答

可以直接在数据库中加上:sp_set_para_value(1,'ENABLE_BLOB_CMP_FLAG',1);

参数说明
将数据库参数ENABLE_BLOB_CMP_FLAG设置为1后,数据库支持DISTINCTORDER BY、分析函数和集函数支持对大字段进行处理。

ENABLE_BLOB_CMP_FLAG:是否支持大字段类型的比较。0:不支持;1:支持。设置为1后支持DISTINCT、ORDER BY、分析函数和集函数支持对大字段进行处理。

2、关键字

解答

达梦的关键字也不能碰撞,遇到一个记录一个,碰到关键字需要使用双引号框起来,例:"user"

  • user

3、if 兼容问题

解答

达梦中已经不支持if相关操作,需要修改为case when,例子如下:

count(distinct if(t2.included_venture = '是', t2.id, null)) as includedVenture 
count(distinct case when t2.included_venture = '是' then t2.id else null end) as includedVenture

4、CURDATE() 问题

解答

需要做对应修改,例子如下:

CURDATE() between StartTime and EndTime 
需要修改为:CAST(TO_CHAR(CURDATE(), 'yyyymmdd') AS BIGINT) between StartTime and EndTime

5、``的问题

温馨提示

达梦中不支持``,需要去掉,如果一定需要,换成双引号“”

6、报错:仅当指定列列表,且SET IDENTITY_INSERT为ON时,才能对自增列赋值

解答

出错原因是:
1.自增长的SQL表里面插入指定ID的数据的时候,会禁止你操作;
2.插入数据时,自增长列是系统自动处理,不需要指定数值,也指定不了。只有将IDENTITY_INSERT 为 ON 时插入数据时,自增长列才可以指定一个值。
解决方法如下:

SET IDENTITY_INSERT 表名 ON;
温馨提示

这里有一个非常坑的地方,那就是如果你是在程序中插入,那么你必须在插入之前就执行一遍这个方法,要不就会报错![aru_149]
就算你通过aop等切面操作来实现了这个功能,如果你加入了事务,那么这些sql的位置也依然有可能发生改变。达梦内部在每个连接表之后又自动的将这个表设置为off,所以还是有可能报错!
博主暂时先将这个为自增的字段去掉自增,因为默认aop中给id赋值了[aru_111]
据说配置:on sql off on sql off 可以实现这个需求,感兴趣可以自己操作实现一下![aru_42]

7、达梦实现mysql的 HEX()AES_ENCRYPT() 加解密相关

解答

在达梦8中,我们实现加解密需要使用另一种方法实现,在官方文档中几乎看不到对应的文档。在它的文档中,我们实现的加密出来的结果和在其他地方加密的结果是不一致的,比如说网站在线加解密、mysql中的加解密等,就算我们将所有的参数全部设置为一致的,也不能实现对应的效果,需要如下面所示修改才行![aru_46]

加密相关

SELECT
	BINTOCHAR (
		HEX(
			DBMS_CRYPTO.ENCRYPT(
				UTL_I18N.STRING_TO_RAW ( 'DBC超级大汇总', 'UTF8' ),
				DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5,
				UTL_I18N.STRING_TO_RAW ( '1234567812345678', 'UTF8' ) 
			) 
		) 
	) from dual;

加密后效果

达梦适配MySQL你踩了多少个坑?插图

解密相关

SELECT
	UTL_I18N.RAW_TO_CHAR (
		DBMS_CRYPTO.DECRYPT (
			unhex (
			CHARTOBIN ( 'B3E6A687E7C0187739D2F7FD7D585BF4A57DBDEB61762AB0EA8ABC2909DBD8E4')),
			DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5,
			UTL_I18N.STRING_TO_RAW ( '1234567812345678', 'UTF8' ) 
		),
	'UTF8' 
	) FROM dual;

解密后效果

达梦适配MySQL你踩了多少个坑?插图2

总结

上面的操作之后,和在线网站、mysql中的解密都是一致的,至此实现我们想要的功能![aru_50]

  • 在线网站解密截图
    • 达梦适配MySQL你踩了多少个坑?插图4

  • MySQL中解密截图
    • 达梦适配MySQL你踩了多少个坑?插图6

8、未识别的符号[-]

达梦适配MySQL你踩了多少个坑?插图8

解答
  • jdbc:dm://127.0.0.1:5236?schema=XXX-XXX,程序启动时总是报连接异常或者未识别的符号[-]
    • 达梦中如果想登录后访问其他模式下的表(非默认模式),可以在jdbc连接串中用schema=模式名的方式。
    • 如果模式名含有特殊字符的,需要将模式名用两层双引号包起来,即:schema=""模式名""这样的方式。

发表评论 取消回复
表情 图片 链接 代码

分享