flike/kingshard

jdbc的null关键字不能使用formatValue中的"NULL"返回问题

liuzhuan23 opened this issue · 0 comments

hi,首先请原谅我用中文描述这个问题

在使用jdbc测试kingshard时,发现问题如下:

jdbc版本: mysql connect/j mysql-connector-java-5.1.49.jar
jdbc测试代码:
PreparedStatement statement = connection.prepareStatement(sql);
ResultSet rs = statement.executeQuery(); //查询并获得resultset
int col = rs.getMetaData().getColumnCount(); //获得列
ResultSetMetaData md= rs.getMetaData();
int columnSize = md.getColumnCount();

while (rs.next()) { //遍历resultset集合
	for (int i = 1; i <= col; i++) {
		String _v = "";
		_v = rs.getString(i); //强制使用string返回
		......
	}
}

以上代码在执行时,会引发这个异常
java.sql.SQLException: Bad format for Timestamp 'NULL' .....

那么这个问题是因为在kingshard中这一行引起的
proxy\server\conn_resultset.go:
func formatValue(value interface{}) ([]byte, error) {
if value == nil {
return hack.Slice("NULL"), nil //这里的"NULL"返回jdbc,jdbc都是使用java null关键字做判定,并不适用"NULL"这个字符串
}
...........
}

在jdbc实现中,可以参考引发异常的文件
src/com/mysql/jdbc/ResultSetImpl.java:
private Timestamp getTimestampFromString(int columnIndex, Calendar targetCalendar, String timestampValue, TimeZone tz, boolean rollForward) throws java.sql.SQLException {
try {
this.wasNullFlag = false;

	if (timestampValue == null) { //几乎都是使用null关键字做判定
		this.wasNullFlag = true;
		return null;
	}
	.......................
	.......................
	 
	year = Integer.parseInt(timestampValue.substring(0, 4)); //这里就会发生异常,因为"NULL"字符串无法parser
	month = Integer.parseInt(timestampValue.substring(5, 7));
	day = Integer.parseInt(timestampValue.substring(8, 10));
}

最后,我修改了jdbc的代码,是可以在驱动层解决这个"NULL"的问题,但是我希望在kingshard也可以解决,于是我尝试修改fun formatValue(),让他在遇到nil value时,返回nil 切片,
但同样会被处理为""空字符串,这同样不同于java null关键字

以上就是我遇到的问题,谢谢你们阅读问题