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关键字
以上就是我遇到的问题,谢谢你们阅读问题