Mycat-Server icon indicating copy to clipboard operation
Mycat-Server copied to clipboard

tinyint(1),bit(1) 取值问题

Open zzchangfu opened this issue 5 years ago • 11 comments

数据库字段: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 avatar Jul 29 '20 09:07 zzchangfu

@zzchangfu 问题无法复现,请提供

  • 建表语句
  • schema.xml里面的表配置信息
  • jdbc测试代码

funnyAnt avatar Aug 16 '20 13:08 funnyAnt

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 avatar Sep 17 '20 12:09 lnat

@lnat 根据你提供的信息复现不了问题,可能和你的客户端和mysql相关字符集配置有关系。如果方便,请自己debug代码,找出相关的错误代码反馈出来。

funnyAnt avatar Oct 02 '20 09:10 funnyAnt

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

lnat avatar Oct 10 '20 07:10 lnat

那这个问题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 avatar Oct 18 '20 11:10 funnyAnt

目前我们的测试是这样的,@funnyAnt @zzchangfu

lnat avatar Oct 19 '20 01:10 lnat

那这个问题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版本变更成这样考虑的是什么呀?我升了下版本把我坑惨了...又退回去了

SignUp-StealWheel avatar Oct 28 '20 09:10 SignUp-StealWheel

@HelloWorldHelloPKU 如果你用jdbc驱动方式连接mysql, tinyInt 要解析成什么和驱动里面的参数tinyInt1isBit设置有关,mycat仅仅是透传。 你认为1.6.75版本有问题,直接改写url里面的再参数验证下,或者直接用native方式连接mysql。

funnyAnt avatar Jan 01 '21 07:01 funnyAnt

mycat1.6.3使用jdbc连接mysql8.0也有这个问题,坑爹啊

ifakeu avatar Jan 29 '22 02:01 ifakeu