Mysql varchar 한글 길이 - Mysql varchar hangeul gil-i

MySQL 문자열 길이 구하는 함수

1. LENGTH() : 길이를 bytes로 나타낸다.

SELECT LENGTH('한글') -> 6
SELECT LENGTH('abc') -> 3


2. CHAR_LENGTH() : 글자의 수를 나타낸다.

SELECT CHAR_LENGTH('한글') -> 2
SELECT CHAR_LENGTH('abc') -> 3


3. BIT_LENGTH() : 길이를 bit로 나타낸다.

SELECT BIT_LENGTH('한글a') -> 56
SELECT BIT_LENGTH('한글')   -> 48


** 참고로 MySQL에서는 UTF-8일 경우 한글은 3bytes, 영어는 1bytes 처리하네요 ^^



공유하기

게시글 관리

구독하기세상 품기

MySQL varchar 한글 입력사이즈는?

개발/디테일 2021. 10. 13. 19:42

MySQL 버전 4.1 이상부터는 글자수 그대로 varchar 갯수가 체크됨
https://dung-beetle.tistory.com/26

 

반응형

공유하기

게시글 관리

구독하기컴퓨터 알고리즘 그리고 문학

저작자표시

'개발 > 디테일' 카테고리의 다른 글

java 9 ~ 16 + 17 특징 정리  (0)2022.11.28python: yield 를 통한 데이터 전달  (0)2021.10.13네트워크: ConnectionTimeout, Read Timeout  (0)2021.10.12자바 스레드 안전한 중지  (0)2021.10.12자바 HashMap 효과적으로 사용하기  (0)2021.10.12

관련글 관련글 더보기

  • java 9 ~ 16 + 17 특징 정리
  • python: yield 를 통한 데이터 전달
  • 네트워크: ConnectionTimeout, Read Timeout
  • 자바 스레드 안전한 중지

댓글 0

댓글 접기 댓글 펼치기

이전 댓글 더보기

댓글

비밀글

등록

  • 오라클 하던 생각으로 막연히 varchar(길이) 안의 길이가 바이트를 나타낸다고 생각하고 있었는데, 오늘 실험 결과 글자(character)단위 길이인 것을 확인했다.

  • mariadb 10 (utf-8) 의 varchar(10)에 한글 10자를 넣어 보니 정상적으로 들어갔다.

  • LENGTH(입력값) = 30, CHAR_LENGTH(입력값) = 10 의 결과가 나왔다.

메시지를 담는 컬럼이 크기 초과로 에러가 발생했다.

(conn=581480) Data too long for column 'RESULT_MSG' at row 1
org.hibernate.engine.jdbc.spi.SqlException

방어 코드를 넣기 위해 최대 크기를 테스트 해보았다.

 

임시 테스트 생성

임시로 테스트 테이블을 만들고...

create table P_TEMP (
    id int(20) unsigned auto_increment,
    name varchar(5) null,
    PRIMARY KEY (id)
);

6글자를 초과하는 데이터를 입력해본다. (당연히 실패를 예상하고 진행)

INSERT INTO `payment`.`P_TEMP` (`name`) VALUES ('나모의노트2')
[2019-12-12 11:51:54] [22001][1406] Data truncation: Data too long for column 'name' at row 1

한글 5글자를 넣어본다. (될까?)

INSERT INTO `payment`.`P_TEMP` (`name`) VALUES ('나모의노트')
[2019-12-12 11:52:40] 1 row affected in 14 ms

MySql 버전 확인

이 결과는 MySql 버전에 따라 다를 수 있다. (경우에 따른 버전 확인은 제타 위키 참조)

위의 테스트한 것은 5.7에서 테스트를 진행했다.

버전 4에서는 바이트단위였다고 한다. (출처)

select version();
5.7.12-log

크기를 구해보자

length가 문자열의 길이를 구해줄 것 같지만 byte단위의 크기를 돌려준다.

문자열의 길이는 char_length이다.

select name, length(name), char_length(name) from P_TEMP where id = 1;
Mysql varchar 한글 길이 - Mysql varchar hangeul gil-i
결과

 

공유하기

게시글 관리

구독하기나모의 노트

'DB > MySQL,MariaDB' 카테고리의 다른 글

Aurora MySQL - alter table modify column 에러  (0)2019.09.10[MySQL] docker에 CLI로 접속하기  (0)2018.11.21

반응형

#mysql varchar로 선언하면 한글은 몇글자까지 넣을 수 있을까?

개발쪽에서 한글입력관련 이슈를 문의해서

Varchar(50) 으로 선언한 컬럼에 데이터를 넣었을 때 몇글자에서 too long error가 나서 안들어갈까 확인해보았다.

 

#구글링으로 찾아본 정의들

[ euc-kr ]  
ascii 코드 + 한글  
영문/숫자/기호는 1바이트. 한글과 한자는 2바이트  
euc-kr 또는 ksc5601  
웹페이지 작성에 사용가능  
특수한 외국어 문자나 일본식/중국식 한자는 표현불가  
   
[ unicode ]  
모든 글자를 2바이트로 표현  
전세계 모든 글자들을 한꺼번에 표현가능  
웹페이지 작성에 사용불가  
   
[ utf-8 ]  
영문/숫자/기호는 1바이트로, 한글과 한자 등은 3바이트로 표현  
전세계 모든 글자들을 한꺼번에 표현가능  
웹페이지 작성에 사용가능

 
•table을 정의할때 varchar(60)처럼 (n)으로 열 타입의 크기를 정하는데, mysql 4.1 이전에는 n이 바이트였다면, 4.1 이후부터는 문자 수다. 
•즉 varcher(60)이면 아스키 문자든 한글이든 60자만큼 입력가능하다는 의미이다. 
•charater_length(char_length)는 문자수를 계산하는 연산이지만, octet_length는 바이트 수를 계산하는 연산 이므로 인코딩방식을 주의하여 사용해야합니다.

 

#결론

--------------------------------------------------------------------------------------------

mysql은 varchar로 선언하면 정말 한글자씩 인식해서 들어간다.

다만 이종 DB로 마이그레이션시 이슈가 될 수 있을 거 같다.

 

실제로 내가 쓴 글자수 = varchar(50) 안에 들어가는지 아닌지는 아래 함수로 확인해보면 된다.

 

length function으로는 mysql에서 정확하게 확인이 안되고,

아래 함수로 확인하면 된다.

 

ex)
select CHAR_LENGTH('현재 사용중인 요금제와 선택한 요금제가 같음, 선택한 요금제와 현재 요금제의 종류가 다름') from dual;
--varchar(50)으로 선언한 컬럼이라면 값이 50넘으면  too long error 난다.

select CHAR_LENGTH('현재 사용중인 요금제와 선택한 요금제가 같음, 선택한 요금제와 현재 요금제의 종류가 다름 하') from dual; 
--> 에러남 ^^

 

반응형

공유하기

게시글 관리

구독하기쇠똥구리 DBA

'RDB > mysql' 카테고리의 다른 글

[장애] innodb Dead Lock 문제  (0)2020.03.03mysql TEXT like 검색 개선 포인트 찾기 1  (0)2020.02.07mysql shell script 2  (0)2019.09.09Mysql shell script 1  (0)2019.09.09Xtrabackup 2.49 설치  (0)2019.09.06