测试环境 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 将超出的列值自动进行了截断,取了取值上限
那么,可以证明的 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 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