준호씨의 블로그

MySQL - CHAR_LENGTH 함수로 문자의 길이를 구하자. INSERT, UPDATE에서 사용할 때 주의할 점 본문

개발이야기

MySQL - CHAR_LENGTH 함수로 문자의 길이를 구하자. INSERT, UPDATE에서 사용할 때 주의할 점

준호씨 2022. 11. 7. 23:30
반응형

문자의 길이를 구할 때 사용하는 함수로 LENGTH와 CHAR_LENGTH가 있습니다.

다음 결과를 보면 length는 문자열의 bytes를 char_length는 문자열의 문자 개수를 나타낸다는 것을 알 수 있습니다.

select length('안녕하세요'),      # 15
       char_length('안녕하세요'); # 5

 

insert 문과 char_length

대충 아래와 같이 contents와 contents의 길이를 저장하는 테이블이 있습니다.

CREATE TABLE articles (
    id INTEGER NOT NULL auto_increment,
    contents text,
    length bigint comment 'char_length of contents',
    PRIMARY KEY (`id`)
);

 

만약 contents에 글의 내용을 넣고, length에 글이 길이를 넣는다고 하면 다음과 같이 할 수 있습니다.

INSERT INTO articles (id, contents, length) VALUES (1, '안녕하세요', char_length('안녕하세요'));

 

이렇게 해도 이상하지 않지만 contents가 길어진다고 생각하면 안 그래도 긴 글의 내용을 똑같이 두 번씩 넣는다는 게 좀 부담스럽습니다. 그래서 조금 신기하게도 아래와 같이 해도 됩니다.

INSERT INTO articles (id, contents, length) VALUES (1, '안녕하세요', char_length(contents));

 

다만 주의해야 될 부분이 있습니다. 순서를 잘 지켜야 된다는 것인데요.

만약 다음과 같이 contents 내용이 뒤에 가게 되면 length에는 null이 들어가게 됩니다.

INSERT INTO articles (id, length, contents) VALUES (1, char_length(contents), '안녕하세요');

 

update 문의 char_length

update문도 insert문과 마찬가지로 순서에 주의해야 합니다. 다음과 같이 contents를 먼저 set 하고 char_length를 구하면 정상적으로 잘 처리되는데요.

update articles
   set contents = '하하하',
       length = char_length(contents)
 where id = 1;

 

아래처럼 char_length가 앞에 나오게 되면 기존 DB에 저장되어 있던 값('안녕하세요')에 대한 길이를 먼저 구해버리게 됩니다.

update articles
   set length = char_length(contents),
       contents = '하하하'
 where id = 1;

기타

물론 필요하면 length 같은 것은 trigger를 이용해서 구현할 수도 있습니다. contents가 수정되면 length를 구해서 저장하는 트리거를 작성하는 것이죠. 다만 요즘은 점점 트리거나 프로시저 같은 것은 관리가 잘 안 되는 편이라 많이 사용하는 편은 아닙니다. 같은 맥락으로 보면 앞서 적은 insert나 update에서 char_length를 구하는 것은 상황에 따라 가독성을 해칠 수도 있기 때문에 조직이 분위기에 따라 사용하지 않는 것이 좋을 수도 있습니다. DB에서 길이를 구하지 않더라도 DB를 호출하는 프로그램에서 미리 계산할 수도 있는 것이니까요.

 

참고

https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_char-length

https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_length

 

반응형
Comments