达梦数据库:dm与mysql语法差异(select)
目录
- 简介
- 语法差异
简介
对接dm数据库,记录与mysql-select的语法差异
语法差异
1、select时,达梦数据库字段别名不支持单引号,支持双引号
2、在开启大小写敏感的情况下,在DM管理工具select时,达梦数据库字段别名不支持单引号,也不支持双引号。在Mapper的XML编写的sql支持双引号
3、在开启大小写敏感的情况下,select时,达梦数据库字段不支持反引号
4、达梦数据库where条件字段不支持双引号
5、达梦数据库不支持DATE_SUB()函数,可以使用DATEADD()函数代替
mysql:select DATE_SUB(DATE_FORMAT(NOW(),'%Y-%m-%d'), INTERVAL 30 DAY);
dm:SELECT DATEADD(DAY, -30, DATE_FORMAT(NOW(),'%Y-%m-%d'));
6、mysql与达梦数据库date_add函数的使用有差异
mysql:SELECT date_add(NOW(),INTERVAL 7 DAY);
dm:SELECT DATEADD(DAY, 7, NOW());
7、达梦数据库不支持date()函数,可以用其他函数代替
select TO_CHAR(now(), 'YYYY-MM-DD');
select DATE_FORMAT(now(), '%Y-%m-%d');
8、达梦数据库不支持GROUP_CONCAT()函数,可以用其他函数代替
返回的是字符串:LISTAGG(字段,'分隔符')
返回的是长文本:WM_CONCAT(字段)
9、mysql的GROUP_CONCAT(字段 ORDER BY 字段 )在达梦数据库应替换为:LISTAGG(字段,',' ) WITHIN GROUP (ORDER BY 字段)
10、达梦数据库除数不能为0
11、达梦数据库的"case when"语句"then"后边只能是固定值
12、CAST(value AS TYPE)函数将value转为字符串时,应该使用VARCHAR,而不是CHAR
正确示例,VARCHAR为可变长字符串:CAST( 111 AS VARCHAR )
错误示例,CHAR是固定字符串:CAST( 111 AS CHAR )
13、达梦数据UNIX_TIMESTAMP()函数必须要传递日期
14、在mapper中达梦数据库不支持binary CURDATE()、binary CURTIME()
15、select时,如果字段名正好是关键字,要加上双引号,否则会字段名称会变成大写
16、如果程序使用shardingsphere框架,DDL时,如果字段名正好是关键字,要加上双引号,否则可能报错空指针,因为shardingsphere对接DM时,使用的是SQL92 SQL解析器,解析不了部分SQL
17、如果程序使用shardingsphere框架,则不支持CHAr_LENGTH()函数,应使用LENGTH()函数,因为shardingsphere对接DM时,使用的是SQL92 SQL解析器,SQL92不支持CHAr_LENGTH()函数
18、mysql的information_schema.columns、information_schema.tables对应达梦数据库的SYS.DBA_COL_COMMENTS、SYS.DBA_TABLES
19、达梦数据库不支持DATABASE()函数,应使用SYS_CONTEXT('userenv', 'current_schema')
20、达梦数据库不支持UUID()函数,可以使用LOWER(RAWTOHEX(SYS_GUID()))代替,如果程序使用shardingsphere框架,使用LOWER()函数会导致报错,原因不明
21、达梦数据库的MD5()函数返回的字母是大写,可以使用LOWER(MD5())转为小写