Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- AI
- 정보처리기사실기 기출문제
- PETERICA
- 오블완
- mysql 튜닝
- 티스토리챌린지
- 코틀린 코루틴의 정석
- Elasticsearch
- Java
- APM
- Linux
- 정보처리기사 실기
- CKA 기출문제
- AWS EKS
- kotlin
- IntelliJ
- MySQL
- kotlin spring
- Spring
- 공부
- Pinpoint
- minikube
- aws
- CloudWatch
- 기록으로 실력을 쌓자
- Kubernetes
- kotlin querydsl
- 정보처리기사 실기 기출문제
- CKA
- kotlin coroutine
Archives
- Today
- Total
피터의 개발이야기
[JAVA] Mysql varchar에 맞춰 java subString 방법 본문
반응형
ㅁ 개요
Mysql varchar 컬럼의 사이즈에 맞게 문자열을 짤라서 넣어야 되는 상황이었다.
JAVA에서 책정한 문자길이와 디비 varchar에서 책정되는 문자길이가 다른점을 발견하였다.
정확히 varchar에 맞게 문자열을 짤라 넣기 위해서는 JAVA와 Mysql의 문자길이 체크 방법을 명확히 알아야만 한다.
그 방법에 대해서 정리하였다.
ㅁ 테스트를 위한 TEST 테이블 생성
create table TEST
(
TEST varchar(10) charset utf8 not null
);
ㅁ Mysql의 length와 char_length 차이 비교
select
TEST,
CHAR_LENGTH(TEST) charLen,
LENGTH(TEST) len
from TEST;
ㅇ char_length는 영어,숫자, 한글, 특수기호 상관없이 글자수로 표시한다.
ㅇ length는 문자열의 byte길이를 표출하기 때문에 utf-8에서 한글은 한글자당 3을 차지한다.
ㅁ JAVA 테스트 코드
public Mono<Object> varcharSubStrTest(ServerHttpRequest request, ServerHttpResponse response, NotiBp notiBp) {
List<String> testList = new ArrayList<>();
testList.add("가나다라마가나다라마");
testList.add("1234567890");
testList.add("abcdefghij");
testList.add("!@#$%^&*()");
for (String test : testList){
log.info(test);
log.info("length={}", test.length());
log.info("UTF_8 length={}", test.getBytes(StandardCharsets.UTF_8).length);
log.info("toCharArray length={}", test.toCharArray().length);
}
return Mono.just(new Result());
}
2022-05-24 11:37:31.536 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2118) : 가나다라마가나다라마 2022-05-24 11:37:31.536 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2119) : length=10 2022-05-24 11:37:31.536 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2120) : UTF_8 length=30 2022-05-24 11:37:31.536 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2121) : toCharArray length=10 2022-05-24 11:37:31.536 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2118) : 1234567890 2022-05-24 11:37:31.537 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2119) : length=10 2022-05-24 11:37:31.537 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2120) : UTF_8 length=10 2022-05-24 11:37:31.537 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2121) : toCharArray length=10 2022-05-24 11:37:31.537 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2118) : abcdefghij 2022-05-24 11:37:31.537 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2119) : length=10 2022-05-24 11:37:31.537 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2120) : UTF_8 length=10 2022-05-24 11:37:31.537 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2121) : toCharArray length=10 2022-05-24 11:37:31.537 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2118) : !@#$%^&*() 2022-05-24 11:37:31.537 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2119) : length=10 2022-05-24 11:37:31.537 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2120) : UTF_8 length=10 2022-05-24 11:37:31.537 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2121) : toCharArray length=10 |
ㅇ UTF-8 length가 30인 경우를 제외하고 모두 10이라는 결과값을 얻었다.
ㅁ varchar size 크기만큼 글자를 잘라주는 util 코드
public static String subVarcharStr(String msg, int maxSize) {
String rtnVal = "";
if (ObjectUtils.isEmpty(msg))
return rtnVal;
try {
StringBuilder sbStr = new StringBuilder(maxSize);
int nCnt = 0;
for(char ch: msg.toCharArray()){
if(++nCnt > maxSize) break;
sbStr.append(ch);
}
rtnVal = sbStr.toString();
} catch (Exception e) {
log.warn(e.getMessage(), e);
return null;
}
return rtnVal;
}
ㅁ UTIL 테스트 코드
public Mono<Object> varcharSubStrTest(ServerHttpRequest request, ServerHttpResponse response, NotiBp notiBp) {
List<String> testList = new ArrayList<>();
testList.add("가나다라마가나다라마가나다라마가나다라마");
testList.add("12345678901234567890");
testList.add("abcdefghijabcdefghij");
testList.add("!@#$%^&*()!@#$%^&*()");
for (String test : testList){
log.info(test);
log.info("subVarcharStr={}", RcsUtil.subVarcharStr(test, 10));
}
return Mono.just(new Result());
}
ㅇ 문자길이를 길게 작성하여 varchar(10)에 맞게 문자열이 잘라지는 지 테스트 해보았다.
2022-05-24 11:47:38.605 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2118) : 가나다라마가나다라마가나다라마가나다라마 2022-05-24 11:47:38.606 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2119) : subVarcharStr=가나다라마가나다라마 2022-05-24 11:47:38.606 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2118) : 12345678901234567890 2022-05-24 11:47:38.606 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2119) : subVarcharStr=1234567890 2022-05-24 11:47:38.606 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2118) : abcdefghijabcdefghij 2022-05-24 11:47:38.606 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2119) : subVarcharStr=abcdefghij 2022-05-24 11:47:38.606 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2118) : !@#$%^&*()!@#$%^&*() 2022-05-24 11:47:38.606 [ctor-http-nio-2] INFO [k.c.u.r.r.s.RsBpService ] (2119) : subVarcharStr=!@#$%^&*() |
ㅇ 테스트 시 문자열에 맞추어 잘려지는 지 확인할 수 있었다.
반응형
'Programming > JAVA' 카테고리의 다른 글
[JAVA] 코드 컨벤션의 필요성,IntellJ 코드 컨벤션 설정 (0) | 2023.02.14 |
---|---|
[Java 8] Stream은 사용 후 반드시 close 해야합니까? (0) | 2023.02.08 |
[JAVA] Serialization, 직렬화와 역직렬화 (0) | 2021.01.24 |
[JAVA] Java replace (0) | 2021.01.19 |
[JAVA] 자바 파일 입출력, 커스컴 AutoCloseable (0) | 2021.01.17 |
Comments