Java 프레임워크 만들기 - JSP

자바 마리아디비 숫자형 데이터 타입(tinyint, smallint, mediumint, int/integer) PreparedStatement 처리 1 - Java MariaDB Numeric Data Types PreparedStatement

carrotweb 2021. 7. 21. 22:57
728x90
반응형

MariaDB(마리아디비)에서 Numeric Data Types(숫자형 데이터 타입)별로 PreparedStatement에서 어떤 메소드로 값으로 설정해야 하는지 확인해 보겠습니다.

Numeric Data Types(숫자형 데이터 타입)의 키워드는 다음과 같습니다.

SIGNED : 부호가 있는 숫자 (음수를 표현할 수 있습니다.) ex) -15, 15

UNSIGNED : 부호가 없는 숫자 (음수를 표시할 수 없습니다.) ex) 15

UNSIGNED ZEROFILL : 부호가 없는 숫자이고 문자로 가져올 때 지정된 길이로 숫자 앞에 "0"를 채웁니다. ex) 015

Numeric Data Types(숫자형 데이터 타입)에서 (M)은 ZEROFILL 타입에서 사용하는 숫자의 최대 표시 너비입니다. 부동 소수점과 고정 소수점 타입의 경우 (M)은 저장할 수 있는 총 자릿수입니다.

Numeric Data Types(숫자형 데이터 타입)에 (M)을 설정하지 않으면 숫자의 Range(범위)에 맞게 숫자의 최대 표시 너비로 설정됩니다. 간단하게 TINYINT로 설명하겠습니다.

TINYINT : 부호가 있는 숫자로 음수 기호를 포함해서 표시(-128)하기 위해 최대 표시 너비가 4가 됩니다.

TINYINT UNSIGNED : 부호가 없는 숫자로 최대 숫자인 255까지 표시할 수 있어 최대 표시 너비가 3이 됩니다.

TINYINT - 아주 작은 정수(very small integer)

TINYINT(M)

Range(범위) : -128 ~ 127

TINYINT(M) UNSIGNED

TINYINT(M) UNSIGNED ZEROFILL

Range(범위) : 0 ~ 255

(M)을 설정하지 않으면 SIGNED은 음수 기호를 포함해서 4로 UNSIGNED (ZEROFILL)은 3으로 설정됩니다.

 

CREATE TABLE DAT_TEST1_TB (
	COL_TINYINT tinyint(4),
	COL_UNTINYINT tinyint(3) unsigned,
	COL_UNZEROTINYINT tinyint(3) unsigned zerofill
) DEFAULT CHARSET=utf8;
String query = "INSERT INTO DAT_TEST1_TB (COL_TINYINT, COL_UNTINYINT, COL_UNZEROTINYINT) VALUES (?, ?, ?)";

 

PreparedStatement에서는 아주 작은 정수인 tinyint 타입을 설정할 수 있는 메소드는 없습니다.

그래서 setShort()메소드나 setInt()메소드를 사용하시면 됩니다.

short data1 = 127;
short data2 = 15;
short data3 = 5;

PreparedStatement preparedStatement = connection.prepareStatement(query);				
preparedStatement.setShort(1, data1);
preparedStatement.setShort(2, data2);
preparedStatement.setShort(3, data3);

 

범위를 벗어나다면 java.sql.SQLException으로 "Out of range value for column" 에러가 발생합니다.

short data1 = 127;
short data2 = -15; // Error 유발
short data3 = 5;

PreparedStatement preparedStatement = connection.prepareStatement(query);				
preparedStatement.setShort(1, data1);
preparedStatement.setShort(2, data2);
preparedStatement.setShort(3, data3);
java.sql.SQLSyntaxErrorException: (conn=1125) Out of range value for column 'COL_UNTINYINT' at row 1
Caused by: org.mariadb.jdbc.internal.util.exceptions.MariaDbSqlException: Out of range value for column 'COL_UNTINYINT' at row 1
Caused by: java.sql.SQLException: Out of range value for column 'COL_UNTINYINT' at row 1

 

ZEROFILL은 SELECT 쿼리할 때 숫자의 최대 표시 너비로 숫자 앞에 "0"를 채워서 리턴합니다. (단, 숫자형 타입이 아닌 문자형 타입으로 받아야 합니다.) 실제 값에는 영향을 주지 않습니다.

 

SELECT 쿼리문으로 가져올때 숫자형 타입(getShort(), getInt(), getLong())으로 가져오면 숫자로 가져옵니다.

String query = "SELECT COL_TINYINT AS signedTinyInt, COL_UNTINYINT AS unTinyInt, COL_UNZEROTINYINT AS unZeroTinyInt FROM DAT_TEST1_TB";
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
	System.out.println("signedTinyInt := " + resultSet.getShort(1));
	System.out.println("unTinyInt := " + resultSet.getShort(2));
	System.out.println("unZeroTinyInt := " + resultSet.getShort(3));
}
resultSet.close();
signedTinyInt := 127
unTinyInt := 15
unZeroTinyInt := 5

 

문자형 타입으로 가져오면 ZEROFILL가 있는 COL_UNZEROTINYINT는 지정된 길이로 숫자 앞에 "0"를 채워서 가져옵니다.

String query = "SELECT COL_TINYINT AS signedTinyInt, COL_UNTINYINT AS unTinyInt, COL_UNZEROTINYINT AS unZeroTinyInt FROM DAT_TEST1_TB";
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
	System.out.println("signedTinyInt := " + resultSet.getString(1));
	System.out.println("unTinyInt := " + resultSet.getString(2));
	System.out.println("unZeroTinyInt := " + resultSet.getString(3));
}
resultSet.close();
signedTinyInt := 127
unTinyInt := 15
unZeroTinyInt := 005

만약, COL_UNZEROTINYINT의 ZEROFILL가 10이라면 숫자 앞에 9개의 "0"이 채워집니다.

COL_UNZEROTINYINT tinyint(10) unsigned zerofill
unZeroTinyInt := 0000000005

이처럼 ZEROFILL를 사용하실 때는 용도에 맞게 사용하셔야 합니다.

 

참고로, DBeaver에서는 Data Type에서 ZEROFILL이 별도로 표시되어 있지 않습니다. 그래서 컬럼에 ZEROFILL 타입으로 설정하고 싶으시면 Data Type를 선택하신 후 직업 입력해야 합니다. 또는 위의 쿼리문처럼 컬럼에 설정해주시면 됩니다.

 

 

SMALLINT - 작은 정수(small integer)

SMALLINT(M)

Range(범위) : -32,768 ~ 32,767

SMALLINT(M) UNSIGNED

SMALLINT(M) UNSIGNED ZEROFILL

Range(범위) : 0 ~ 65,535

(M)을 설정하지 않으면 SIGNED은 음수 기호를 포함해서 6로 UNSIGNED (ZEROFILL)은 5으로 설정됩니다.

 

CREATE TABLE DAT_TEST2_TB (
	COL_SMALLINT smallint(6),
	COL_UNSMALLINT smallint(5) unsigned,
	COL_UNZEROSMALLINT smallint(5) unsigned zerofill
) DEFAULT CHARSET=utf8;
String query = "INSERT INTO DAT_TEST2_TB (COL_SMALLINT, COL_UNSMALLINT, COL_UNZEROSMALLINT) VALUES (?, ?, ?)";

 

PreparedStatement에서는 작은 정수인 smallint 타입을 설정할 수 있는 setShort()메소드를 사용하시면 됩니다. 그러나 UNSIGNED를 설정하기 위해서는 setInt()메소드를 사용해야 합니다.

short data1 = 32767;
int data2 = 32768;
int data3 = 68;

preparedStatement = connection.prepareStatement(query);
preparedStatement.setShort(1, data1);
preparedStatement.setInt(2, data2);
preparedStatement.setInt(3, data3);

 

범위를 벗어나다면 java.sql.SQLException으로 "Out of range value for column" 에러가 발생합니다.

int data1 = 32768; // Error 유발
int data2 = 32768; 
int data3 = 68;

preparedStatement = connection.prepareStatement(query);
preparedStatement.setInt(1, data1);
preparedStatement.setInt(2, data2);
preparedStatement.setInt(3, data3);
java.sql.SQLSyntaxErrorException: (conn=1696) Out of range value for column 'COL_SMALLINT' at row 1
Caused by: org.mariadb.jdbc.internal.util.exceptions.MariaDbSqlException: Out of range value for column 'COL_SMALLINT' at row 1
Caused by: java.sql.SQLException: Out of range value for column 'COL_SMALLINT' at row 1

 

SELECT 쿼리문으로 가져올때 숫자형 타입(SIGNED를 가져오기 위해 getShort()과 UNSIGNED를 가져오기 위해 getInt(), getLong())으로 가져오면 숫자로 가져옵니다.

String query = "SELECT COL_SMALLINT AS signedSmallInt, COL_UNSMALLINT AS unSmallInt, COL_UNZEROSMALLINT AS unZeroSmallInt FROM DAT_TEST2_TB";
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
	System.out.println("signedSmallInt := " + resultSet.getShort(1));
	System.out.println("unSmallInt := " + resultSet.getInt(2));
	System.out.println("unZeroSmallInt := " + resultSet.getInt(3));
}
resultSet.close();
signedSmallInt := 32767
unSmallInt := 32768
unZeroSmallInt := 68

 

문자형 타입으로 가져오면 ZEROFILL가 있는 COL_UNZEROSMALLINT는 지정된 길이로 숫자 앞에 "0"를 채워서 가져옵니다.

String query = "SELECT COL_SMALLINT AS signedSmallInt, COL_UNSMALLINT AS unSmallInt, COL_UNZEROSMALLINT AS unZeroSmallInt FROM DAT_TEST2_TB";
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
	System.out.println("signedSmallInt := " + resultSet.getString(1));
	System.out.println("unSmallInt := " + resultSet.getString(2));
	System.out.println("unZeroSmallInt := " + resultSet.getString(3));
}
resultSet.close();
signedSmallInt := 32767
unSmallInt := 32768
unZeroSmallInt := 00068

 

 

 

MEDIUMINT - 중간 크기의 정수(medium-sized integer)

MEDIUMINT(M)

Range(범위) : -8,388,608 ~ 8,388,607

MEDIUMINT(M) UNSIGNED

MEDIUMINT(M) UNSIGNED ZEROFILL

Range(범위) : 0 ~ 16,777,215

(M)을 설정하지 않으면 SIGNED은 음수 기호를 포함해서 9로 UNSIGNED (ZEROFILL)은 8으로 설정됩니다.

 

CREATE TABLE DAT_TEST3_TB (
	COL_MEDIUMINT mediumint(9),
	COL_UNMEDIUMINT mediumint(8) unsigned,
	COL_UNZEROMEDIUMINT mediumint(8) unsigned zerofill
) DEFAULT CHARSET=utf8;
String query = "INSERT INTO DAT_TEST3_TB (COL_MEDIUMINT, COL_UNMEDIUMINT, COL_UNZEROMEDIUMINT) VALUES (?, ?, ?)";

 

PreparedStatement에서는 중간 크기의 정수인 mediumint 타입을 설정할 수 있는 setInt()메소드를 사용하시면 됩니다.

int data1 = 8388607;
int data2 = 8388608;
int data3 = 608;

preparedStatement = connection.prepareStatement(query);
preparedStatement.setInt(1, data1);
preparedStatement.setInt(2, data2);
preparedStatement.setInt(3, data3);

 

SELECT 쿼리문으로 가져올때 숫자형 (getInt(), getLong())으로 가져오면 숫자로 가져옵니다.

String query = "SELECT COL_MEDIUMINT AS signedMediumInt, COL_UNMEDIUMINT AS unMediumInt, COL_UNZEROMEDIUMINT AS unZeroMediumInt FROM DAT_TEST3_TB";
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
	System.out.println("signedMediumInt := " + resultSet.getInt(1));
	System.out.println("unMediumInt := " + resultSet.getInt(2));
	System.out.println("unZeroMediumInt := " + resultSet.getInt(3));
}
resultSet.close();
signedMediumInt := 8388607
unMediumInt := 8388608
unZeroMediumInt := 608

 

문자형 타입으로 가져오면 ZEROFILL가 있는 COL_UNZEROMEDIUMINT는 지정된 길이로 숫자 앞에 "0"를 채워서 가져옵니다.

String query = "SELECT COL_MEDIUMINT AS signedMediumInt, COL_UNMEDIUMINT AS unMediumInt, COL_UNZEROMEDIUMINT AS unZeroMediumInt FROM DAT_TEST3_TB";
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
	System.out.println("signedMediumInt := " + resultSet.getString(1));
	System.out.println("unMediumInt := " + resultSet.getString(2));
	System.out.println("unZeroMediumInt := " + resultSet.getString(3));
}
resultSet.close();
signedMediumInt := 8388607
unMediumInt := 8388608
unZeroMediumInt := 00000608

 

 

INT, INTEGER - 정수(normal-size integer)

INT(M), INTEGER(M)

Range(범위) : -2,147,483,648 ~ 2,147,483,647

INT(M) UNSIGNED, INTEGER(M) UNSIGNED

INT(M) UNSIGNED ZEROFILL, INTEGER(M) UNSIGNED ZEROFILL

Range(범위) : 0 ~ 4,294,967,295

(M)을 설정하지 않으면 SIGNED은 음수 기호를 포함해서 11로 UNSIGNED (ZEROFILL)은 10으로 설정됩니다.

 

CREATE TABLE DAT_TEST4_TB (
	COL_INT int(11),
	COL_UNINT int(10) unsigned,
	COL_UNZEROINT int(10) unsigned zerofill
) DEFAULT CHARSET=utf8;
String query = "INSERT INTO DAT_TEST4_TB (COL_INT, COL_UNINT, COL_UNZEROINT) VALUES (?, ?, ?)";

 

PreparedStatement에서는 정수인 int 타입을 설정할 수 있는 setInt()메소드를 사용하시면 됩니다. 그러나 UNSIGNED를 설정하기 위해서는 setLong()메소드를 사용해야 합니다.

int data1 = 2147483647;
long data2 = 4294967295L;
long data3 = 608;

preparedStatement = connection.prepareStatement(query);
preparedStatement.setInt(1, data1);
preparedStatement.setLong(2, data2);
preparedStatement.setLong(3, data3);

 

SELECT 쿼리문으로 가져올때 숫자형 (getInt(), getLong())으로 가져오면 숫자로 가져옵니다.

String query = "SELECT COL_INT AS signedInt, COL_UNINT AS unInt, COL_UNZEROINT AS unZeroInt FROM DAT_TEST4_TB";
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
	System.out.println("signedInt := " + resultSet.getInt(1));
	System.out.println("unInt := " + resultSet.getLong(2));
	System.out.println("unZeroInt := " + resultSet.getLong(3));
}
resultSet.close();
signedInt := 2147483647
unInt := 4294967295
unZeroInt := 608

 

문자형 타입으로 가져오면 ZEROFILL가 있는 COL_UNZEROMEDIUMINT는 지정된 길이로 숫자 앞에 "0"를 채워서 가져옵니다.

String query = "SELECT COL_INT AS signedInt, COL_UNINT AS unInt, COL_UNZEROINT AS unZeroInt FROM DAT_TEST4_TB";
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
	System.out.println("signedInt := " + resultSet.getString(1));
	System.out.println("unInt := " + resultSet.getString(2));
	System.out.println("unZeroInt := " + resultSet.getString(3));
}
resultSet.close();
signedInt := 2147483647
unInt := 4294967295
unZeroInt := 0000000608
728x90
반응형