이어서 MariaDB(마리아디비)에서 Numeric Data Types(숫자형 데이터 타입)에서 큰 정수와 실수들은 PreparedStatement에서 어떤 메소드로 값으로 설정해야 하는지 확인해 보겠습니다.
BIGINT - 큰 정수(large integer)
BIGINT(M)
Range(범위) : -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
BIGINT(M) UNSIGNED
BIGINT(M) UNSIGNED ZEROFILL
Range(범위) : 0 ~ 18,446,744,073,709,551,615
(M)을 설정하지 않으면 SIGNED은 음수 기호를 포함해서 20로 UNSIGNED (ZEROFILL)은 20으로 설정됩니다.
CREATE TABLE DAT_TEST5_TB (
COL_BIGINT bigint(20),
COL_UNBIGINT bigint(20) unsigned,
COL_UNZEROBIGINT bigint(20) unsigned zerofill
) DEFAULT CHARSET=utf8;
String query = "INSERT INTO DAT_TEST5_TB (COL_BIGINT, COL_UNBIGINT, COL_UNZEROBIGINT) VALUES (?, ?, ?)";
PreparedStatement에서는 큰 정수인 bigint 타입을 설정할 수 있는 setLong()메소드를 사용하시면 됩니다. 그러나 UNSIGNED를 설정하기 위해서는 setBigDecimal()메소드를 사용해야 합니다.
long data1 = 9223372036854775807L;
BigDecimal data2 = new BigDecimal("18446744073709551615");
BigDecimal data3 = new BigDecimal("51615");
preparedStatement = connection.prepareStatement(query);
preparedStatement.setLong(1, data1);
preparedStatement.setBigDecimal(2, data2);
preparedStatement.setBigDecimal(3, data3);
Java에서는 큰 정수를 처리하기 위해 BigInteger와 BigDecimal가 있습니다. 그러나 PreparedStatement에서는 BigInteger를 처리하는 메소드가 없습니다. 그래서 BigDecimal로 사용해야 합니다.
만약, BigInteger를 사용해야 한다면 BigDecimal로 만들어서 처리하면 됩니다.
BigInteger data = new BigInteger("372036854775807");
BigDecimal data2 = new BigDecimal(data);
SELECT 쿼리문으로 가져올때 숫자형 (getLong(), getBigDecimal())으로 가져오면 숫자로 가져옵니다.
String query = "SELECT COL_BIGINT AS signedBigInt, COL_UNBIGINT AS unBigInt, COL_UNZEROBIGINT AS unZeroBigInt FROM DAT_TEST5_TB";
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
System.out.println("signedBigInt := " + resultSet.getLong(1));
System.out.println("unBigInt := " + resultSet.getBigDecimal(2));
System.out.println("unZeroBigInt := " + resultSet.getBigDecimal(3));
}
resultSet.close();
signedBigInt := 9223372036854775807
unBigInt := 18446744073709551615
unZeroBigInt := 51615
만약, BigInteger를 사용해야 한다면 BigDecimal로 가져와서 BigInteger로 전환(Convert)하면 됩니다.
BigInteger data = resultSet.getBigDecimal(2).toBigInteger();
문자형 타입으로 가져오면 ZEROFILL가 있는 COL_UNZEROBIGINT는 지정된 길이로 숫자 앞에 "0"를 채워서 가져옵니다.
String query = "SELECT COL_BIGINT AS signedBigInt, COL_UNBIGINT AS unBigInt, COL_UNZEROBIGINT AS unZeroBigInt FROM DAT_TEST5_TB";
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
System.out.println("signedBigInt := " + resultSet.getString(1));
System.out.println("unBigInt := " + resultSet.getString(2));
System.out.println("unZeroBigInt := " + resultSet.getString(3));
}
resultSet.close();
signedBigInt := 9223372036854775807
unBigInt := 18446744073709551615
unZeroBigInt := 00000000000000051615
DECIMAL - 실수, 고정 소수점 숫자
DECIMAL(M,D)
DECIMAL(M,D) UNSIGNED
DECIMAL(M,D) UNSIGNED ZEROFILL
(M)은 총 자릿수(precision, 정밀도) 이고 (D)는 소수점 이하 자릿수(scale, 스케일)입니다. (M)의 자릿수에는 "-"와 "."을 포함되지 않습니다. (M)의 최대 자릿수는 65이고 (D)의 최대 자릿수는 30입니다.
decimal(2,1) := 1.2
decimal(3,2) := 12.3
decimal(5,2) := 123.45
(M,D)을 설정하지 않으면 SIGNED과 UNSIGNED (ZEROFILL) 구분없이 (M)은 10으로 (D)은 0으로 설정됩니다. 테스트를 위해 (M)은 15으로 (D)은 5로 설정하였습니다.
CREATE TABLE DAT_TEST6_TB (
COL_DECIMAL decimal(15,5),
COL_UNDECIMAL decimal(15,5) unsigned,
COL_UNZERODECIMAL decimal(15,5) unsigned zerofill
) DEFAULT CHARSET=utf8;
String query = "INSERT INTO DAT_TEST5_TB (COL_DECIMAL, COL_UNDECIMAL, COL_UNZERODECIMAL) VALUES (?, ?, ?)";
PreparedStatement에서는 고정 소수점 숫자인 decimal 타입을 설정할 수 있는 setBigDecimal()메소드를 사용하시면 됩니다.
BigDecimal data1 = new BigDecimal("4073709551.615");
BigDecimal data2 = new BigDecimal("7440737095.51615");
BigDecimal data3 = new BigDecimal("51.615");
preparedStatement = connection.prepareStatement(query);
preparedStatement.setBigDecimal(1, data1);
preparedStatement.setBigDecimal(2, data2);
preparedStatement.setBigDecimal(3, data3);
SELECT 쿼리문으로 가져올때 숫자형 (getBigDecimal())으로 가져오면 숫자로 가져옵니다.
String query = "SELECT COL_DECIMAL AS signedDecimal, COL_UNDECIMAL AS unDecimal, COL_UNZERODECIMAL AS unZeroDecimal FROM DAT_TEST6_TB";
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
System.out.println("signedDecimal := " + resultSet.getBigDecimal(1));
System.out.println("unDecimal := " + resultSet.getBigDecimal(2));
System.out.println("unZeroDecimal := " + resultSet.getBigDecimal(3));
}
resultSet.close();
signedDecimal := 4073709551.61500
unDecimal := 7440737095.51615
unZeroDecimal := 51.61500
문자형 타입으로 가져오면 ZEROFILL가 있는 COL_UNZERODECIMAL는 지정된 길이로 숫자 앞에 "0"를 채워서 가져옵니다.
String query = "SELECT COL_DECIMAL AS signedDecimal, COL_UNDECIMAL AS unDecimal, COL_UNZERODECIMAL AS unZeroDecimal FROM DAT_TEST6_TB";
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
System.out.println("signedDecimal := " + resultSet.getString(1));
System.out.println("unDecimal := " + resultSet.getString(2));
System.out.println("unZeroDecimal := " + resultSet.getString(3));
}
resultSet.close();
signedDecimal := 4073709551.61500
unDecimal := 7440737095.51615
unZeroDecimal := 0000000051.61500
FLOAT - 실수, 작은 (단일 정밀도) 부동 소수점 숫자(small (single-precision) floating-point number)
FLOAT(M,D)
FLOAT(M,D) UNSIGNED
FLOAT(M,D) UNSIGNED ZEROFILL
Range(범위) : -3.402823466E+38 ~ -1.175494351E-38, 0, 1.175494351E-38 ~ 3.402823466E+38
Range(범위)는 IEEE 표준을 기반으로 하는 이론적인 한계입니다. 실제 범위는 하드웨어 또는 운영 체제에 따라 약간 더 작을 수 있습니다.
(M)은 총 자릿수(precision, 정밀도) 이고 (D)는 소수점 이하 자릿수(scale, 스케일)입니다.
(M,D)을 설정하지 않으면 SIGNED과 UNSIGNED (ZEROFILL) 구분없이 하드웨어에서 허용하는 한계까지 저장됩니다.
그리고 소수점 이하 약 7자리까지 정확합니다.
테스트를 위해 SIGNED과 UNSIGNED은 (M)을 5으로 (D)을 2으로, UNSIGNED ZEROFILL은 (M)을 5으로 (D)을 0으로 설정하였습니다.
CREATE TABLE DAT_TEST7_TB (
COL_FLOAT float(5,2),
COL_UNFLOAT float(5,2) unsigned,
COL_UNZEROFLOAT float(5,0) unsigned zerofill
) DEFAULT CHARSET=utf8;
String query = "INSERT INTO DAT_TEST7_TB (COL_FLOAT, COL_UNFLOAT, COL_UNZEROFLOAT) VALUES (?, ?, ?)";
PreparedStatement에서는 작은 (단일 정밀도) 부동 소수점 숫자인 float 타입을 설정할 수 있는 setFloat()메소드를 사용하시면 됩니다.
float data1 = -999.99F;
float data2 = 999.99F;
float data3 = 9F;
preparedStatement = connection.prepareStatement(query);
preparedStatement.setFloat(1, data1);
preparedStatement.setFloat(2, data2);
preparedStatement.setFloat(3, data3);
SELECT 쿼리문으로 가져올때 숫자형 (getFloat())으로 가져오면 숫자로 가져옵니다.
String query = "SELECT COL_FLOAT AS signedFloat, COL_UNFLOAT AS unFloat, COL_UNZEROFLOAT AS unZeroFloat FROM DAT_TEST7_TB";
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
System.out.println("signedFloat := " + resultSet.getFloat(1));
System.out.println("unFloat := " + resultSet.getFloat(2));
System.out.println("unZeroFloat := " + resultSet.getFloat(3));
}
resultSet.close();
signedFloat := -999.99
unFloat := 999.99
unZeroFloat := 9.0
문자형 타입으로 가져오면 ZEROFILL가 있는 COL_UNZEROFLOAT는 지정된 길이로 숫자 앞에 "0"를 채워서 가져옵니다.
String query = "SELECT COL_FLOAT AS signedFloat, COL_UNFLOAT AS unFloat, COL_UNZEROFLOAT AS unZeroFloat FROM DAT_TEST7_TB";
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
System.out.println("signedFloat := " + resultSet.getString(1));
System.out.println("unFloat := " + resultSet.getString(2));
System.out.println("unZeroFloat := " + resultSet.getString(3));
}
resultSet.close();
signedFloat := -999.99
unFloat := 999.99
unZeroFloat := 00009
DOUBLE - 실수, 일반 (복수 정밀도) 부동 소수점 숫자(normal-size (double-precision) floating-point number)
DOUBLE(M,D)
DOUBLE(M,D) UNSIGNED
DOUBLE(M,D) UNSIGNED ZEROFILL
Range(범위) : -1.7976931348623157E+308 ~ -2.2250738585072014E-308, 0, 2.2250738585072014E-308 ~ 1.7976931348623157E+308
Range(범위)는 IEEE 표준을 기반으로 하는 이론적인 한계입니다. 실제 범위는 하드웨어 또는 운영 체제에 따라 약간 더 작을 수 있습니다.
(M)은 총 자릿수(precision, 정밀도) 이고 (D)는 소수점 이하 자릿수(scale, 스케일)입니다.
(M,D)을 설정하지 않으면 SIGNED과 UNSIGNED (ZEROFILL) 구분없이 하드웨어에서 허용하는 한계까지 저장됩니다.
그리고 소수점 이하 약 15자리까지 정확합니다.
테스트를 위해 SIGNED과 UNSIGNED은 (M)을 10으로 (D)을 3으로, UNSIGNED ZEROFILL은 (M)을 10으로 (D)을 0으로 설정하였습니다.
CREATE TABLE DAT_TEST8_TB (
COL_DOUBLE double(10,3),
COL_UNDOUBLE double(10,3) unsigned,
COL_UNZERODOUBLE double(10,0) unsigned zerofill
) DEFAULT CHARSET=utf8;
String query = "INSERT INTO DAT_TEST8_TB (COL_DOUBLE, COL_UNDOUBLE, COL_UNZERODOUBLE) VALUES (?, ?, ?)";
PreparedStatement에서는 일반 (복수 정밀도) 부동 소수점 숫자인 double 타입을 설정할 수 있는 setDouble()메소드를 사용하시면 됩니다.
double data1 = -1234567.899D;
double data2 = 1234567.899D;
double data3 = 9D;
preparedStatement = connection.prepareStatement(query);
preparedStatement.setDouble(1, data1);
preparedStatement.setDouble(2, data2);
preparedStatement.setDouble(3, data3);
SELECT 쿼리문으로 가져올때 숫자형 (getDouble())으로 가져오면 숫자로 가져옵니다.
String query = "SELECT COL_DOUBLE AS signedDouble, COL_UNDOUBLE AS unDouble, COL_UNZERODOUBLE AS unZeroDouble FROM DAT_TEST8_TB";
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
System.out.println("signedDouble := " + resultSet.getDouble(1));
System.out.println("unDouble := " + resultSet.getDouble(2));
System.out.println("unZeroDouble := " + resultSet.getDouble(3));
}
resultSet.close();
signedDouble := -1234567.899
unDouble := 1234567.899
unZeroDouble := 9.0
문자형 타입으로 가져오면 ZEROFILL가 있는 COL_UNZERODOUBLE는 지정된 길이로 숫자 앞에 "0"를 채워서 가져옵니다.
String query = "SELECT COL_DOUBLE AS signedDouble, COL_UNDOUBLE AS unDouble, COL_UNZERODOUBLE AS unZeroDouble FROM DAT_TEST8_TB";
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
System.out.println("signedDouble := " + resultSet.getString(1));
System.out.println("unDouble := " + resultSet.getString(2));
System.out.println("unZeroDouble := " + resultSet.getString(3));
}
resultSet.close();
signedDouble := -1234567.899
unDouble := 1234567.899
unZeroDouble := 0000000009
BIT - 비트 (bit-field type)
BIT(M)
(M)의 최대 자릿수는 64입니다. (M)을 설정하지 않으면 1로 설정됩니다.
CREATE TABLE DAT_TEST9_TB (
COL_BIT bit(8)
) DEFAULT CHARSET=utf8;
String query = "INSERT INTO DAT_TEST9_TB (COL_BIT) VALUES (?)";
PreparedStatement에서는 bit 타입을 설정할 수 있는 메소드는 없습니다.
그래서 setInt()메소드를 사용하시면 됩니다.
int data1 = 85;
preparedStatement = connection.prepareStatement(query);
preparedStatement.setInt(1, data1);
BIT는 2진법으로 "0"과 "1"를 사용합니다.
위처럼 (M)이 "8"이면 비트가 8개로 2^8입니다. 256가지를 표현할 수 있습니다. 그런데 "0"를 포함하기 때문에 최대 입력 값은 255입니다.
128 64 32 16 8 4 2 1
--------------------
1 1 1 1 1 1 1 1
그래서 setInt()메소드를 이용하여 0부터 255까지 입력하면 됩니다.
참고로 쿼리문에서는 비트 값을 b'value' 표기법으로 삽입할 수 있습니다. 여기서 value는 "0"과 "1"입니다.
INSERT INTO DAT_TEST9_TB (COL_BIT) VALUES (b'01010101');
BIT는 왼쪽에서 비트의 전체 길이까지 자동으로 "0"으로 채워집니다.
BIT(4)이고 값이 "10"이면 "0010"로 됩니다.
만약, (M)이 "1"이면 setBoolean()메소드를 사용하시면 됩니다.
CREATE TABLE DAT_TEST9_TB (
COL_BIT bit(1)
) DEFAULT CHARSET=utf8;
boolean data1 = true;
preparedStatement = connection.prepareStatement(query);
preparedStatement.setBoolean(1, data1);
SELECT 쿼리문으로 가져올때 숫자형 (getDouble())으로 가져오면 숫자로 가져옵니다.
String query = "SELECT COL_BIT AS bit FROM DAT_TEST9_TB";
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
System.out.println("bit := " + resultSet.getInt(1));
}
resultSet.close();
bit := 85
SELECT 쿼리문으로 2진법 표기법으로 가져올때 쿼리문에 BIN()를 사용하여 문자형 (getString())으로 가져옵니다.
String query = "SELECT BIN(COL_BIT) AS bit FROM DAT_TEST9_TB";
PreparedStatement preparedStatement1 = connection.prepareStatement(query1);
ResultSet resultSet = preparedStatement1.executeQuery();
if (resultSet.next()) {
System.out.println("bit := " + resultSet.getString(1));
}
resultSet.close();
bit := 1010101
SELECT 쿼리문으로 2진법, 8진법, 16진법 표기법으로 가져올때 쿼리문에 BIN(), OCT(), HEX()를 사용하여 문자형 (getString())으로 가져옵니다.
String query = "SELECT COL_BIT AS bit, BIN(COL_BIT) AS bit2, OCT(COL_BIT) AS bit8, HEX(COL_BIT) AS bit16 FROM DAT_TEST9_TB";
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
System.out.println("bit := " + resultSet.getString(1));
System.out.println("bit2 := " + resultSet.getString(2));
System.out.println("bit8 := " + resultSet.getString(3));
System.out.println("bit16 := " + resultSet.getString(4));
}
resultSet.close();
bit := 85
bit2 := 1010101
bit8 := 125
bit16 := 55