오라클 데이터베이스에 데이터를 저장할 때, 특정 문자가 정상적으로 입력되지 않거나 깨지는 경우가 발생할 수 있다.
특히, 중국어(난 중국어가 밉다........하)와 같은 다국어 문자를 저장할 때 데이터베이스와 애플리케이션 간 문자 인코딩이 맞지 않으면 문제가 생길 수 있다.
이를 해결하기 위해 HTML 엔티티 형식으로 데이터를 변환하여 입력하는 방법을 사용한다.
HMTL 엔티티란?
HTML 엔티티는 HTML에서 특정 문자를 표현하기 위해 사용하는 코드이다.
각 문자를 &#유니코드값; 형태로 변환하여 저장하며, 이를 통해 데이터가 깨지지 않고 안전하게 입력될 수 있다.
예를 들어, 社会는 HTML 엔티티로 社会와 같이 변환된다.
1. 의존성 설정
Apache Commons Text 라이브러리를 사용해 HTML 엔티티를 변환하고 복원한다. (Maven)
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.10.0</version>
</dependency>
2. HTML 엔티티 변환 및 저장
import org.apache.commons.text.StringEscapeUtils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class HtmlEntityToDatabase {
public static void main(String[] args) {
// 원본 문자열
String[] departments = {
"社会福利学部 社会事业学专业",
"商经学部 经营学专业",
"商经学部 国际贸易学专业"
};
try {
// 오라클 DB 연결(생략)
// 데이터 저장
String insertQuery = "INSERT INTO department_info (id, name) VALUES (?, ?)";
PreparedStatement preparedStatement = connection.prepareStatement(insertQuery);
for (int i = 0; i < departments.length; i++) {
String originalText = departments[i];
// HTML 엔티티로 변환
String htmlEntityText = StringEscapeUtils.escapeHtml4(originalText);
// DB에 저장
preparedStatement.setInt(1, i + 1); // id
preparedStatement.setString(2, htmlEntityText); // name
preparedStatement.executeUpdate();
System.out.println("Original: " + originalText);
System.out.println("Stored as HTML Entity: " + htmlEntityText);
}
preparedStatement.close();
connection.close();
System.out.println("Data inserted successfully!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. 저장 데이터 복원
import org.apache.commons.text.StringEscapeUtils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class HtmlEntityFromDatabase {
public static void main(String[] args) {
try {
// 오라클 DB 연결(생략)
// 데이터 조회
String selectQuery = "SELECT id, name FROM department_info";
PreparedStatement preparedStatement = connection.prepareStatement(selectQuery);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
int id = resultSet.getInt("id");
String htmlEntityText = resultSet.getString("name");
// HTML 엔티티를 원래 문자열로 복원
String originalText = StringEscapeUtils.unescapeHtml4(htmlEntityText);
System.out.println("ID: " + id);
System.out.println("Stored HTML Entity: " + htmlEntityText);
System.out.println("Restored Original: " + originalText);
}
resultSet.close();
preparedStatement.close();
connection.close();
System.out.println("Data retrieved and restored successfully!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
실행결과
/**
* 데이터 저장 단계
**/
Original: 社会福利学部 社会事业学专业
Stored as HTML Entity: 社会福利学部 社会事业学专业
...
Data inserted successfully!
/**
* 데이터 복원 단계
**/
ID: 1
Stored HTML Entity: 社会福利学部 社会事业学专业
Restored Original: 社会福利学部 社会事业学专业
...
Data retrieved and restored successfully!
다 쓰고나서 알았는데 ChatGPT에 복사해 넣으니까 알아서 변환해주더라.. 하..하하하ㅏ하
반응형
'Dev > DB' 카테고리의 다른 글
[DB] Oracle에서 다양한 방법으로 테이블 백업하기 (1) | 2024.11.21 |
---|---|
[DB] Character set 'utf8mb3' is not supported by .Net Framework. (2) | 2024.11.18 |
[DB] ORA-12505 에러 원인 및 해결 방법 (3) | 2024.11.10 |
[DB] 오라클 DBA_TAB_PRIVS 테이블 계정 권한 조회하기 (0) | 2024.11.07 |
[ORACLE] Function과 Procedure의 효율적인 사용 방법 (4) | 2024.09.08 |