tinyint(1),bit(1) 取值问题
数据库字段:tinyint(1) 存放0 和1,直接连接数据库正常读取。Java使用Boolean 接收 0 显示false,1 显示 true。通过mycat 连接之后,java使用Boolean 接收 都是 true,使用 Integer 接收 ,0 返回 48。 感觉再 mycat中 存储, 把 tinyint 存放的值 是 ascii 码
mycat 版本 mycat-1.6.7.5 mysql 版本:5.7.20
@zzchangfu 问题无法复现,请提供
- 建表语句
- schema.xml里面的表配置信息
- jdbc测试代码
CREATE TABLE test_tinyint (
mq_status tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
<schema name="common" checkSQLschema="true" sqlMaxLimit="100" dataNode="common_dn">
</schema>
<dataNode name="common_dn" dataHost="localhost" database="common" />
<dataHost name="localhost" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="jdbc:mysql://192.168.2.28:3306" user="root" password="123456">
<readHost host="hostS1" url="jdbc:mysql://192.168.2.28:3306" user="root" password="123456" />
</writeHost>
</dataHost>
ä¸éè¦jdbcç´æ¥æ¯sqlyogè¿æ¥mycatç´æ¥æ¥è¯¢è¯å¥ï¼å°±ä¼å¤ç°
@lnat 根据你提供的信息复现不了问题,可能和你的客户端和mysql相关字符集配置有关系。如果方便,请自己debug代码,找出相关的错误代码反馈出来。
dbDriver="jdbc" 时候这个问题会被重现 native不会 , 如果一定要用参考下面 java.lang.Boolean if the configuration property tinyInt1isBit is set to true (the default) and the storage size is 1, or java.lang.Integer if not. JDBC的URL增加 tinyInt1isBit=false参数 @funnyAnt
那这个问题schema.xml里面添加tinyInt1isBit=false解决,不需要修改代码:
<dataHost name="localhost" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="jdbc:mysql://192.168.2.28:3306?tinyInt1isBit=false" user="root" password="123456">
<readHost host="hostS1" url="jdbc:mysql://192.168.2.28:3306?tinyInt1isBit=false" user="root" password="123456" />
</writeHost>
</dataHost>
目前我们的测试是这样的,@funnyAnt @zzchangfu
那这个问题schema.xml里面添加tinyInt1isBit=false解决,不需要修改代码:
<dataHost name="localhost" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="jdbc:mysql://192.168.2.28:3306?tinyInt1isBit=false" user="root" password="123456"> <readHost host="hostS1" url="jdbc:mysql://192.168.2.28:3306?tinyInt1isBit=false" user="root" password="123456" /> </writeHost> </dataHost>
那为什么1.6 release版本不会有这个问题呢~~1.6.75版本变更成这样考虑的是什么呀?我升了下版本把我坑惨了...又退回去了
@HelloWorldHelloPKU 如果你用jdbc驱动方式连接mysql, tinyInt 要解析成什么和驱动里面的参数tinyInt1isBit设置有关,mycat仅仅是透传。 你认为1.6.75版本有问题,直接改写url里面的再参数验证下,或者直接用native方式连接mysql。
mycat1.6.3使用jdbc连接mysql8.0也有这个问题,坑爹啊