관리 메뉴

피터의 개발이야기

[JAVA] Mysql varchar에 맞춰 java subString 방법 본문

Programming/JAVA

[JAVA] Mysql varchar에 맞춰 java subString 방법

기록하는 백앤드개발자 2022. 5. 23. 16:05
반응형

ㅁ 개요

 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=!@#$%^&*()

 ㅇ 테스트 시 문자열에 맞추어 잘려지는 지 확인할 수 있었다.

반응형
Comments