소스: sql-src/mid_07_string_date/01_string.sql. 직원(emp)과 고객 연락처(cust_info), 문자열 비교용 테이블(str_demo)을 준비했습니다. H2 기본 모드에서 DB를 가리지 않고 쓸 수 있는 표준 문자 함수를 확인합니다.
SELECT
id
, name
, SUBSTR(name, 1, 2) AS first2
, INSTR(name, '민') AS pos_min
, CHAR_LENGTH(name) AS char_len
, OCTET_LENGTH(name) AS byte_len
, LPAD(name, 8, '*') AS lpad_name
, RPAD(name, 8, '*') AS rpad_name
FROM emp
ORDER BY id;ID | NAME | FIRST2 | POS_MIN | CHAR_LEN | BYTE_LEN | LPAD_NAME | RPAD_NAME
---+--------+--------+---------+----------+----------+-------------+------------
1 | 김민준 | 김민 | 2 | 3 | 9 | *****김민준 | 김민준*****
2 | 이서연 | 이서 | 0 | 3 | 9 | *****이서연 | 이서연*****
3 | 최도윤 | 최도 | 0 | 3 | 9 | *****최도윤 | 최도윤*****
(3행)SUBSTR(name, 1, 2) 는 앞 2글자, INSTR(name, '민') 는 '민' 이 있는 위치로 2·3번 직원처럼 없으면 0입니다. CHAR_LENGTH 는 문자 수(3), OCTET_LENGTH 는 바이트 수(9)로 3배 차이가 나고, LPAD·RPAD 는 목표 길이 8에서 남는 만큼 * 을 왼쪽·오른쪽에 채웁니다.
SELECT
TRIM(' hello ') AS trimmed
, LTRIM(' hello') AS ltrimmed
, RTRIM('hello ') AS rtrimmed
, REPLACE('hello world', 'world', 'sql') AS replaced
, UPPER('hello') AS upper_val
, LOWER('HELLO') AS lower_val
FROM emp
WHERE id = 1;TRIMMED | LTRIMMED | RTRIMMED | REPLACED | UPPER_VAL | LOWER_VAL
--------+----------+----------+-----------+-----------+----------
hello | hello | hello | hello sql | HELLO | hello
(1행)TRIM 은 양쪽, LTRIM·RTRIM 은 한쪽 공백만 지웁니다. REPLACE 는 첫 번째 인자에서 두 번째 문자열을 찾아 세 번째 문자열로 바꾸고, UPPER·LOWER 는 영문 대소문자를 바꿉니다.
SELECT
val
, CHAR_LENGTH(val) AS char_len
, OCTET_LENGTH(val) AS byte_len
FROM str_demo
ORDER BY id;VAL | CHAR_LEN | BYTE_LEN
----------+----------+---------
김민준 | 3 | 9
Seoul | 5 | 5
서울Seoul | 7 | 11영문 'Seoul' 은 문자 수와 바이트 수가 5로 같지만, 한글 '김민준' 은 문자 수 3에 바이트 수 9로 3배입니다. 한글과 영문이 섞인 '서울Seoul' 은 문자 수 7(한글 2 + 영문 5), 바이트 수 11(한글 2×3 + 영문 5)로 계산됩니다.
SELECT
id
, phone
, REGEXP_REPLACE(phone, '[0-9]{4}