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 갯수가 체크됨
//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 msMySql 버전 확인
이 결과는 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;
공유하기
게시글 관리
구독하기나모의 노트'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