티스토리 뷰

mysql-connector-java -> mariadb-connector-j 로 변경할때 같은 데이터를 바라보지만 다른 값이 리턴될 수 있다.

 

books 테이블

 

books 테이블에는 deleted 필드가 존재하고 해당 필드에는 CHAR 형식으로 삭제 여부 데이터가 저장된다.

  • deleted = 'Y' : 삭제된 책
  • deleted = 'N' : 삭제되지 않은 책

ResultSet.getBoolean() 함수를 이용하여 해당 필드의 데이터를 가져오면 'Y', 'N' 의 Char 값을 boolean 으로 리턴해준다.

 

이때 mysql-connector-java 와 mariadb-connector-j 의 동작 방식 차이에 의해서 리턴값이 달라진다.

Connector Data Return boolean
mysql-connector-java 'N' false
mariadb-connector-j 'N' true
mysql-connector-java 'Y' true
mariadb-connector-j 'Y' true

mysql-connector-java 를 사용할 당시에는 'N' 은 false 로 제대로 맵핑되었는데 mariadb-connector-j 를 사용하게 되면서 'N' 이 true 로 리턴되기 시작한 것이다.

 

이는 두 Connector 가 ResultSet 을 구현할때의 로직 차이에 의해서 발생한다.

 

mysql-connector-java : ResultSetImpl.java

private final boolean getBooleanFromString(String stringVal, int columnIndex) throws SQLException {
	if (stringVal != null && stringVal.length() > 0) {
		int c = Character.toLowerCase(stringVal.charAt(0));
		return c == 't' || c == 'y' || c == '1' || stringVal.equals("-1");
	} else {
    	return false;
    }
}

mysql connector 가 구현한 ResultSet.getBoolean()  함수에서는 't', 'y', '1' 에 대해서 true 로 리턴해주고 있으며 이에 해당하지 않은 모든 값은 false 를 기본으로 리턴하게 된다.

 

mariadb-connector-j : TextRawProtocol.java

public boolean getInternalBoolean(ColumnDefinition columnInfo) {
	if (lastValueWasNull()) {
		return false;
	}

	if (columnInfo.getColumnType() == ColumnType.BIT) {
		return parseBit() != 0;
	}
	final String rawVal = new String(buf, pos, length, StandardCharsets.UTF_8);
	return !("false".equals(rawVal) || "0".equals(rawVal));
  }

mariadb connector 가 구현한 ResultSet 에서는 'false', '0' 에 대해서만 false 를 리턴하고 이에 해당하지 않는 모든 값은 false 를 리턴하는 로직이다.

 

이 차이에 의해서 저장된 데이터가 'N' 이라면 mysql connector 일때는 false, mariadb connector 일때는 true 가 리턴되었다.

 

저장된 데이터를 다른 타입으로 불러올때 이러한 문제가 있을 수 있으며 가능하면 운영중인 서비스의 Connector 를 변경하는 작업은 지양해야겠다.

또한, Connector 의 구현에 따라서 타입 변환보다는 데이터는 있는 그대로 불러오고 타입 변환은 자체 구현하는게 안전해보인다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함