达梦数据库踩坑
提示:第一次接触达梦,是真的不好用,各种报错不提示详细信息,吐槽归吐槽,还是需要学习使用的。
前言
题主刚接触达梦数据库时,本来是想下载官网的连接工具进行数据库连接的,但是谁曾想,官网既然客户端和服务端集成到一块下载一个压缩包一个多G,题主大为不解。所以第一次使用客户端时,我选择了DBeaver工具。后面做代码本地测试时,才被迫下载了服务器端。
一、达梦和mysql创建database对比
对于mysql我们一般是通过ip地址、端口号、用户名、密码去在mysql的连接工具当中去连接,此时如果这个登录的账号有创建数据的权限是,我们可以直接通过new Database去新建数据库。对于达梦数据来说,我们也可以通过上述的四个参数去连接数据库。但是当我们创建数据库时,需要在达梦数据库的一个模式的目录下去创建,这个操作类似于mysql当中的new Database操作。在创建数据库时,需要勾选忽略大小写敏感。不然后续做数据查询时,默认使用的表名称是大写,如果表定义使用的小写就会报错。
二、spring boot连接达梦数据库出现的异常
Cause: dm.jdbc.driver.DMException:第4 行附近出现错误:无效的表或视图名:
对于spring配置达梦数据库连接时,题主第一次直接在原生的SYSDBA用户连接当中去创建了一个新的模式(即一个新的database)。在spring做数据库查询时就会爆出异常,后面查询得知达梦在查询时,如果用户名和模式名称一致时,查询语句不会拼接模式名称,例如:select * from user。
如果用户名和查询的模式不一致时,达梦默认查询时会默认带上用户名称对应的模式名称。例如如果我们通过SYSDBA登录,新建一个模式(库)TEST,然后在TEST当中新增表数据。spring在做数据查询时,就会报出上述的异常,因为达梦在做数据查询时,使用的sql是select * from SYSDBA.user。此时就会出现异常,所以我们需要给一个模式创建一个单独的用户,且模式的名称和用户名称要完全一致。
三、语法差异
对于创建一个表结构数据,自增主键id的设置和mysql的差异比较大,INT类型的数据不可以设置长度。对于字段的描述和表结构的描述也不可以在表定义上去设置。
-- 创建一个表
CREATE TABLE "mh_user" ("id" BIGINT IDENTITY(1, 1) PRIMARY KEY,"account" VARCHAR(20) NOT NULL,"actual_name" VARCHAR(16) NOT NULL,"company_id" BIGINT DEFAULT NULL,"department_id" BIGINT DEFAULT NULL,"email" VARCHAR(32) DEFAULT NULL,"employee_no" VARCHAR(32) DEFAULT NULL,"password" VARCHAR(64) NOT NULL,"password_status" INT NOT NULL,"enabled" TINYINT NOT NULL,"remark" TEXT,"create_by" INT DEFAULT NULL,"create_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,"update_by" INT DEFAULT NULL,"updated_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,"deleted" TINYINT NOT NULL DEFAULT 0
);
-- 设置表的备注信息
COMMENT ON TABLE "TEST"."mh_user" is '用户信息';
-- 添加字段注释
COMMENT ON COLUMN "mh_user"."id" IS '主键id';
COMMENT ON COLUMN "mh_user"."account" IS '用户名|账号';
总结
上述的问题就是题主在第一次接触达梦时遇到的坑,其实还有就是达梦数据库的语法和mysql语法的差异,主要记录一下解决方案,后续如果再遇到的话,可以快速的去修复。