Java 프레임워크 만들기 - JSP

자바 마리아디비 숫자형 데이터 타입(bigint, decimal, float, double, bit) PreparedStatement 처리 2 - Java MariaDB Numeric Data Types PreparedStatement

carrotweb 2021. 7. 23. 19:51
728x90
반응형

이어서 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
728x90
반응형