MariaDB / 함수 / LEFT, RIGHT / 문자열의 왼쪽 또는 오른쪽의 일부를 출력하는 함수
MariaDB의 LEFT(문자열, 길이)는 왼쪽부터, RIGHT(문자열, 길이)는 오른쪽 끝에서 지정한 문자 수만큼 가져옵니다. 두 함수는 원본 문자열을 수정하지 않으며, 오른쪽에서 가져온 문자열도 원래의 문자 순서로 반환합니다.
LEFT와 RIGHT의 방향
테이블 없이 아래 SELECT를 실행하면 방향을 비교할 수 있습니다. 길이는 가져올 문자 수이며 시작 위치가 아닙니다. LEFT()와 RIGHT()의 첫 인수는 대상 문자열이고 둘째 인수는 길이입니다.
SELECT LEFT('12345678', 3) AS first_three,
RIGHT('12345678', 3) AS last_three;
SELECT LEFT('AB-2026-0042', 2) AS code_prefix,
RIGHT('AB-2026-0042', 4) AS code_suffix;
첫 결과는 123·678, 둘째는 AB·0042입니다. RIGHT가 뒤에서 문자를 선택한다고 해서 876이나 2400처럼 역순으로 바꾸지는 않습니다. 0042는 문자열의 일부이므로 앞의 0이 유지됩니다. 이를 숫자로 변환하면 표시 형식의 0이 사라질 수 있습니다.
길이 0·음수·문자열보다 큰 값
SELECT CONCAT('[', LEFT('abc', 0), ']') AS zero_left,
CONCAT('[', RIGHT('abc', -1), ']') AS negative_right,
LEFT('abc', 20) AS long_left,
RIGHT('abc', 20) AS long_right;
SELECT LEFT(NULL, 2) AS missing_text,
RIGHT('abc', NULL) AS missing_length,
CONCAT('[', RIGHT('', 2), ']') AS empty_text;
길이 0이나 음수의 결과는 빈 문자열이므로 앞의 두 값은 []·[]입니다. 길이가 원래 문자열보다 크면 남는 자리를 채우지 않고 abc 전체를 반환합니다. 음수 길이는 “끝에서 몇 글자를 빼기”라는 의미가 아닙니다. 길이를 사용자 입력으로 받는 프로그램에서는 허용할 정수 범위를 먼저 검증합니다.
NULL 인수가 있으면 NULL을 반환합니다. 빈 문자열은 NULL과 구별되며 위 예제에서는 []로 보입니다. 누락 값도 빈 문자열로 출력할지 여부는 업무 규칙에 따라 결정하고 IFNULL 등으로 명시합니다. 공간을 채워 고정 폭으로 만드는 것이 목적이라면 LEFT·RIGHT 자체에는 패딩 기능이 없다는 점도 구분하세요.
한글과 공백은 어떻게 세나요?
문자 문자열에서는 바이트 수가 아닌 문자 수를 기준으로 자릅니다. 다음 예제는 UTF-8 입력을 사용하고 문자셋을 utf8mb4로 명시합니다. 한글은 UTF-8에서 여러 바이트이지만 아래 추출 길이 2는 두 문자를 뜻합니다.
SELECT LEFT(_utf8mb4'가나다라마', 2) AS left_hangul,
RIGHT(_utf8mb4'가나다라마', 2) AS right_hangul,
HEX(LEFT(_utf8mb4'가나다라마', 2)) AS left_bytes;
SELECT HEX(LEFT(' AB ', 2)) AS left_with_space,
HEX(RIGHT(' AB ', 2)) AS right_with_space,
LEFT(TRIM(' AB '), 2) AS explicitly_trimmed;
한글 결과는 가나다라마의 앞 두 문자인 가나와 뒤 두 문자인 라마이고, left_bytes는 EAB080EB8298입니다. 둘째 조회의 HEX 값은 2041과 4220이며 마지막 값은 AB입니다. 앞뒤 공백도 문자 수에 포함되므로 공백을 무시하려면 의도에 맞게 TRIM을 먼저 적용합니다. 의미 있는 공백까지 지우지 않도록 입력 규칙을 확인하세요.
바이너리 문자열은 바이트 단위가 됩니다. 또한 유니코드의 결합 문자와 결합 이모지는 여러 문자로 구성될 수 있으므로 화면의 한 글자 묶음을 항상 보존하는 자르기라고 가정하면 안 됩니다. 길이 단위는 바이트·비트·문자 길이 비교에서 구별할 수 있습니다.
상품 코드 열의 앞뒤 부분 조회
다음은 실습용 learning 데이터베이스에서 실행하는 전체 예제입니다. CREATE·INSERT·SELECT 권한이 필요하며 edge_code_demo가 이미 있다면 별도 실습 이름으로 바꿉니다. 코드의 구분자가 아니라 고정된 자릿수를 기준으로 추출하는 경우입니다.
USE learning;
CREATE TABLE edge_code_demo (
id INT PRIMARY KEY,
product_code VARCHAR(30) CHARACTER SET utf8mb4 NULL
);
INSERT INTO edge_code_demo VALUES
(1, 'AB-2026-0042'), (2, 'CD-2026-0100'), (3, 'X'), (4, NULL);
SELECT id, product_code,
LEFT(product_code, 2) AS prefix,
RIGHT(product_code, 4) AS suffix
FROM edge_code_demo ORDER BY id;
SELECT id, product_code FROM edge_code_demo
WHERE product_code LIKE 'AB-%' ORDER BY id;
앞 조회의 prefix·suffix는 id 순서대로 (AB,0042), (CD,0100), (X,X), (NULL,NULL)입니다. 짧은 X에 오류가 나는 것은 아니지만, 그 결과가 정상 코드라는 뜻도 아닙니다. 실제 업무에서는 코드 형식과 길이를 검증한 뒤 사용합니다. 뒤 조회는 AB- 접두어를 가진 id=1을 찾으며, 열에 함수를 적용하지 않는 접두어 검색을 표현합니다. 실제 인덱스 사용 여부는 열의 문자셋·인덱스·통계와 실행 계획으로 확인합니다.
중간 위치에서 가져오려면 SUBSTRING()을, 길이가 제각각인 구분자 앞뒤를 가져오려면 SUBSTRING_INDEX()를 검토합니다. 파일 확장자나 가변 길이 경로를 무조건 RIGHT(..., 3)으로 처리하면 네 글자 확장자나 확장자가 없는 이름을 잘못 해석할 수 있습니다. 원본을 바꾸려면 별도의 UPDATE가 필요하며 위 실습 SELECT만으로는 저장 값이 변경되지 않습니다.




