SQL

문자열 연산

1space 2024. 7. 13. 01:04

저번 수치 연산에 이어서 이번에는 문자열 연산입니다. 문자열 연산 역시 문자열 연산자 그리고 문자열 가공하는 함수중 자주 사용하는 것을 뽑아 소개합니다.

 

문자열 연산중에 문자열 결합에 관해서만 설명하겠습니다.

 

문자열 결합

 

문자열 결합이란 문자열 데이터를 결합하는 연산으로 2개의 열 데이터를 모아서 1개의 열로 처리하고 싶은 경우 자주 사용합니다. 문자열 연산자는 데이터베이스 제품마다 각기 다르며 SQL Server 는 + 연산자를 사용하고 Oracle이나 DB2, PostgreSQL에서는 ||연산자를 사용해서 문자열을 결합합니다. MySQL에서는 CONCAT함수로 문자열을 결합합니다. 저는 my sql을 사용하므로 CONCAT함수를 쓰도록 하겠습니다.

 

CONCAT 함수

 

 

quantity 열은 숫자 unit열은 문자열 형입니다. CONCAT함수로 두 열을 결합해보겠습니다.

SELECT CONCAT(quantity,unit) FROM sample35;

 

 

이런식으로 잘 결합된 것을 볼 수 있습니다. 문자열 결합니지만 수치 데이터도 문제없이 연산할 수 있습니다. 단, 문자열로 결합한 결과는 문자열 형이 됩니다.

 

 

SUBSTRING 함수

 

SUBSTRING 함수는 문자열의 일부분을 계산해서 변환해주는 함수입니다. 데이터베이스에 따라서는 함수명이 SUBSTR인 경우도 있습니다. 예를 들어, 해당 날짜 데이터에서 년, 월, 일을 각각 따로 추출해내 보겠습니다.

 

앞 4자리 추출 = 년도 추출

SUBSTRING('20140125001', 1, 4)  -> '2014'

 

5째 자리부터 2자리 추출 = 월 추출

SUBSTRING('20140125001', 5, 2) -> '01'

 

 

TRIM 함수

 

TRIM 함수는 문자열의 앞뒤로 여분의 스페이스가 있을 경우 이를 제거해주는 함수로 문자열 도중에 존재하는 스페이스는 제거되지 않습니다. 

앞에서 설명했듯이 CHAR 형의 문자열형에서는 문자열의 길이가 고정되며 남은 공간은 스페이스로 채워집니다. 이처럼 빈 공간을 채우기 위해 사용한 스페이스를 제거하는데 TRIM가 사용됩니다. 한편, 인수를 지정하는 것으로 스페이스 이외의 문자를 제거할 수도 있습니다.

 

TRIM('ABC    ')  ->  'ABC'

 

 

CHARACTER_LENGTH 함수

 

CHARACTER_LENGTH 함수는 문자열의 길이를 계산해 돌려주는 함수입니다. VARCHAR 형의 문자열은 가변 길이이므로 길이가 서로 다릅니다. CHARACTER_LENGTH 함수를 이용하면 문자열의 길이를 계산할 수 있습니다. 문자열의 길이는 문자 단위로 계산되어 수치로 반환됩니다. 또한 함수명은 CHAR_LENGTH로 줄여서 사용할 수 있습니다. 

 

OCTET_LENGTH 함수

 

OCTET_LENGTH 함수는 문자열의 길이를 바이트 단위로 계산해 돌려주는 함수입니다. 바이트란 데이터 단위중 하나입니다. OCTET_LENGTH 함수를 사용하는 동시에 중요한 것은 문자 하나의 데이터가 몇 바이트의 저장공간을 필요로 하는지 '인코드 방식'에 따라 결정된다는 점입니다. 바꿔 말하자면 문자를 수치화(인코드) 하는 방식에 따라 필요한 저장공간의 크기가 달라진다는 것입니다. 여기서 문자를 수치화 한다는게 이해가 안되실 수도 있습니다. 간단히 설명하자면 컴퓨터 안에는 이미지 데이터, 음성 데이터, 수치 데이터, 문자열 데이터 등 다양한 종류의 데이터가 저장됩니다. 하지만 이런 데이터는 '전부 수치'라고 자주 언급됩니다. 다시 말해 문자열 데이터도 결국 수치로 저장된다는 것입니다.

VARCHAR형의 최대 길이 역시 바이트 단위로 지정합니다. 하지만 문자세트에 따라 길이가 문자 수로 간주되기도 하니 주의할 필요가 있습니다.

 

 

문자세트

 

한중일의 인쇄 문화에서는 반각과 전각이라는 용어를 사용해 문자의 폭을 설명하기도 합니다. 예를 들어 알파벳의 경우는 반각문자, 한글은 전각문자라고 할 수 있습니다. 반각과 전각의 차이는 화면상의 표시를 보면 잘 알 수 있습니다. 반각 문자는 전각문자의 폭의 절반밖에 되지 않으며 저장용량 또한 전각문자가 더 큽니다. 반각의 알파벳이나 숫자, 기호는 'ASCII'문자라고 불립니다.

한글의 경우 'EUC-KR', 'UTF-8' 등의 인코드 방식을 주로 사용합니다. 인코드 방식은 데이터베이스나 테이블을 정의할 떄 변경할 수 있습니다. 이를 RDBMS에서는 '문자세트'라고 부릅니다. 결론은 '한 문자가 몇 바이트인지는 쓰이는 문자세트에 따라 다르다' 입니다.

CHAR_LENGTH 함수를 사용하는 경우에는 아무런 문제가 되지 않습니다. 한글이든 ASCII 문자든 문자 수로 계산되기 때문입니다. 하지만 OCTET_LENGTH 함수의 경우는 문자 수가 아닌 바이트 단위로 길이를 계산하므로 주의할 필요가 있습니다.

 

 

 


참고자료 : <SQL 첫걸음(아사이 아츠시)>

 

'SQL' 카테고리의 다른 글

CASE 문으로 데이터 변환하기  (0) 2024.07.13
날짜 연산  (0) 2024.07.13
수치 연산  (0) 2024.07.12
패턴 매칭 검색  (0) 2024.07.12
테이블 구조 참조  (0) 2024.07.11