【达梦数据库】mysql 和达梦 tinyint 与 bit 返回值类型差异

测试环境 mysql5.7.44
达梦2024Q2季度版

前言

在mysql 中存在 tinyint(1)的用法来实现存储0 1 作为boolean的标识列;但是在达梦并不允许使用 tinyint(1)来定义列,只能使用 tinyint 即 取值范围为:-128 ~ +127;实际上mysql 使用tinyint(1)定义列,取值范围仍为-128 ~ +127,并非 {0, 1} ;但是在mysql 中当 tinyint存储为0 1 时,jdbc 使用getObjecct获取改列的值类型为boolean,并非数字,这又是怎么回事呢。先说答案,为了在达梦JDBC获取到boolean类型需要在数据库中将对应列改为bit 类型。

分析

mysql实验

tinyint取值范围

插入数据验证mysql 的 tinyint(1)的存储范围是否为 {0, 1}

create table test_tinyint_20240911(a1 tinyint(1),name varchar(20));
insert into test_tinyint_20240911 values(100,'test100');
insert into test_tinyint_20240911 values(133,'test100');

在我的测试环境中mysql 将超出的列值自动进行了截断,取了取值上限
mysql插入测试
那么,可以证明的 tinyint(1)的存储范围不为 {0, 1}

tinyint jdbc返回值类型

  • 插入boolean 返回boolean getBoolean在这里插入图片描述
  • 插入数字返回布尔 getObject
    在这里插入图片描述
  • 插入数字返回数字 getObject
    在这里插入图片描述
  • 插入数字返回数字 getInt
    在这里插入图片描述
  • 定义tinyint(13)插入数字返回数字 getInt
    在这里插入图片描述

达梦实验

tinyint建表测试

create table test_tinyint_20240911(a1 tinyint(1),name varchar(20)); --报错
create table test_tinyint_20240911(a1 tinyint,name varchar(20));

insert into test_tinyint_20240911 values(100,'test100');
insert into test_tinyint_20240911 values(133,'test100');


tinyint(1)测试
插入测试

tinyint jdbc返回值类型

  • tinyint 插入boolean返回数字 getObject
    在这里插入图片描述
  • tinyint 插入数字返回数字 getObject

在这里插入图片描述

  • bit 插入boolean 返回boolean getObject

在这里插入图片描述

  • bit 插入boolean 返回数字 getInt
    在这里插入图片描述
  • bit 插入数字 返回boolean getBoolean

在这里插入图片描述

测试结论

测试截图比较乱,但是可以看到当mysql 通过getObject 接口获取数据时,会将大于0 的数字返回为true;而这种情况是因为mysql的默认jdbc连接参数 tinyInt1isBit=true导致的,当 tinyint(1)时通过getObject 获取出的数据为boolean
在这里插入图片描述
在这里插入图片描述
对比达梦的测试结果getObject 获取的值中,数据库类型为bit时返回boolean类型,数据库类型为tinyint时返回值类型为int 数字,当然也可以使用隐式方式将返回结果转变为数字或者boolean类型

对于使用数据库过程中,个人倾向于“O式用法”即要类型一致,boolean就用bit类型存储,时间类型用timestamp 而非字符串;但是实际的使用过程中因为各种原因,仅关注这个模块是否可以跑起来,跑起来就完事大全,这样看似省事,但其实隐藏了其他的问题

对于数据库来说,从数据库中读写数据往往涉及到类型转换,那么数据库是怎么在驱动层制定类型转换的规则,又如何在驱动层完成类型的校验。待我有空 我再去研究研究

参考链接

https://dev.mysql.com/doc/connector-j/en/connector-j-connp-props-result-sets.html#cj-conn-prop_tinyInt1isBit
https://dev.mysql.com/doc/connector-j/en/connector-j-reference-type-conversions.html
https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html
https://eco.dameng.com/document/dm/zh-cn/pm/dm_sql-introduction.html#1.4.1%20%E5%B8%B8%E8%A7%84%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B

### 达梦数据库 MySQL 的语法区别 #### SQL 标准支持 达梦数据库遵循 SQL92 JDBC 等国际标准[^1],而 MySQL 同样也支持 SQL92 及其扩展功能。然而,在某些特定语句上,两者存在细微差别。 #### 数据类型定义 在数据类型的定义方面,两者的实现方式有所不同: - **达梦数据库** 提供了一些特有的数据类型,例如 `DM_DATE` 或者 `LONG VARCHAR`,这些可能无法直接映射到 MySQL 中的标准类型。 - **MySQL** 则更倾向于使用常见的数据类型如 `DATETIME`、`TINYINT` 等,并且提供了更多的 JSON 支持特性[^1]。 #### 查询优化器行为 尽管两种数据库都实现了基本的查询操作符(如 SELECT, INSERT),但在复杂查询场景下表现不同: - 对于窗口函数的支持程度,**达梦数据库** 更接近 Oracle 风格;而在 **MySQL 8.0 版本之前** 并未完全引入此类高级分析工具[^1]。 #### 存储过程触发器编写风格 当涉及到程序化逻辑控制时,比如创建存储过程或者设置触发条件时: - **达梦数据库** 使用 PL/SQL 类似的语法结构来完成任务处理流程设计; - 而对于 **MySQL**, 它采用的是 ANSI SQL 下更为简洁明快的方式来进行相同的工作描述[^1]。 以下是两个简单例子展示它们之间的差异: ```sql -- 创建表 (达梦数据库) CREATE TABLE test_table ( id INT PRIMARY KEY, name NVARCHAR(50), created_at DM_DATE DEFAULT SYSDATE ); -- 创建表 (MySQL) CREATE TABLE test_table ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); ``` ```sql -- 插入记录并返回自增ID (达梦数据库) DECLARE @new_id INT; INSERT INTO test_table(name) VALUES('example') RETURNING id INTO @new_id; SELECT @new_id AS new_record_id FROM DUAL; -- 插入记录并获取最后插入ID (MySQL) INSERT INTO test_table(name) VALUES('example'); SELECT LAST_INSERT_ID() AS new_record_id; ``` #### 字符集排序规则设定 字符编码以及相应的比较顺序也是需要注意的地方之一: - 在安装过程中,默认情况下,**达梦数据库** 设置为 UTF8MB4 编码格式,同时允许用户通过修改配置文件调整具体参数值。 - 相反地,虽然现代版本中的 **MySQL** 默认同样启用了类似的多字节模式,但是仍然保留了较早时期的 latin1 方案选项给开发者选择适用环境需求[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

气可鼓不可泄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值