문자열의 자르거나 합치고 치환하는 많이 사용하는 함수를 정리하였습니다.
문자열을 이용하는 쿼리 사용이 필요한 경우 문자 자르기 치환 공백 제거 등 다양하게 활용할 수 있습니다. MySQL과 호환성이 좋은 MariaDB에서도 사용할 수 있습니다.
MySQL 문자열 관련 함수 요약
ASCII(문자) : 문자의 아스키 코드값 리턴 한다.
SELECT ASCII('문자');
CONCAT('문자열1','문자열2','문자열3'...) : 문자열들을 이어준다.
select concat('ASP,','PHP,','SQL',' WEB STUDY');
INSERT('문자열','시작 위치','길이','새로운 문자열') : 문자열의 시작 위치부터 길이만큼 새로운 문자열로 대치 해주며 '시작 위치' 와 '길이'는 문자열이 아니므로 작은 따옴표로 굳이 묶어주지 않아도 된다.
select insert('MySql web study','7','3','offline'); select insert('MySql web study',7,3,'offline');
REPLACE('문자열','기존 문자열','바뀔 문자열') : 문자열 중 기존 문자열을 바뀔 문자열로 바꾼다.
select replace('MySql web study','web','offline');
INSTR('문자열','찾는 문자열') : 문자열 중 찾는 문자열의 위치 값을 출력하며 값이 존재하지 않으면 0값 리턴 한다.
select instr('MySql web study','s'); select instr('MySql web study','S');
LEFT('문자열',개수) : 문자열 중 왼쪽에서 개수만큼을 추출한다.
select left('MySql web study',5); select left('MySql web study','5');
RIGHT('문자열',개수) : 문자열 중 오른쪽에서 개수만큼을 추출.
select right('MySql web study',5); select right('MySql web study','5');
MID('문자열',시작 위치,개수) : 문자열 중 시작 위치부터 개수만큼 출력해 준다.
select mid('MySql web study',7,3); select mid('MySql web study','7','3');
SUBSTRING('문자열',시작 위치,개수) : 문자열 중 시작 위치부터 개수만큼 출력
select substring('Mysql web study',11,5); select substring('Mysql web study','11','5');
LTRIM('문자열') : 문자열 중 왼쪽의 공백을 없앤다.
select ltrim(' web study');
RTRIM('문자열') : 문자열 중 오른쪽의 공백을 없앤다.
select rtrim('web study ');
TRIM('문자열') : 양쪽 모두의 공백을 없앤다.
select trim(' web study ');
LCASE('문자열') 또는 LOWER('문자열') : 소문자로 바꾼다.
select lcase('MYSQL'); select lower('MySQL');
UCASE('문자열') 또는 UPPER('문자열') : 대문자로 바꾼다.
select ucase('mySql'); select upper('mysql');
REVERSE('문자열') : 문자열을 반대로 나열한다. 예) REVERSE('abcde') ==> edcba
select reverse('lqSyM');
문자열 관련 함수 명령과 출력 결과 예제
문자열 함수에서 사용되는 문자열의 길이가 MySQL 서버 파라미터 중의 max_allowed_packet값보다 크면 함수의 결과로 NULL 이 리턴 된다. 그리고 모든 문자열 함수에서 문자열의 첫 번째 문자의 위치 값은 숫자로 1이다. 0이 아님에 유의하자.
또한 참고로 알아둘 것은 일반적으로 얘기할 때 '문자' 와 '문자열' 은 의미가 다르다. 여기서 말하는 '문자' 는 한 character 의 문자 즉 문자 하나를 의미하며 '문자열' 은 여러 개의 character로 이루어진 문자열은 의미한다.
ASCII(str)
문자열 str 의 가장 왼쪽에 있는 문자의 아스키 코드 값을 가져온다. str 에 문자 대신 숫자가 들어가면 숫자를 문자열 형태로 변환하여 가장 왼쪽 문자의 아스키 코드 값을 가져온다.
mysql> select ascii('a');
+------------+
| ascii('a') |
+------------+
| 97 |
+------------+
1 row in set (0.00 sec)
mysql>
ORD(str)
문자열 str 의 가장 왼쪽에 있는 문장의 아스키 코드 값을 가져온다. 특히 한글과 같이 2byte 이상으로 이루어진 문자에 대해서도 비트 연산을 통해 값을 가져올 수 있다. 따라서 한글과 같은 문자의 아스키 값을 가져올 때 사용할 수 있다.
mysql> select ord('가'); +-----------+ | ord('가') | +-----------+ | 176 | +-----------+ 1 row in set (0.00 sec) mysql>
CONV(N, from_base, to_base)
from_base 진수로 N 인 수를 to_base 진수로 변환한다. 예를 들어 CONV(5, 10, 2) 는 10 진수로 5 인수를 2 진수로 변환한 값 101 을 가져온다.
mysql> select conv(5,10,2);
+--------------+
| conv(5,10,2) |
+--------------+
| 101 |
+--------------+
1 row in set (0.44 sec)
mysql>
BIN(N)
N 을 2 진수로 표현한 문자열을 가져온다.
mysql> select bin(12);
+---------+
| bin(12) |
+---------+
| 1100 |
+---------+
1 row in set (0.00 sec)
mysql>
OCT(N)
N 을 8 진수로 표현한 문자열을 가져온다.
mysql> select oct(12);
+---------+
| oct(12) |
+---------+
| 14 |
+---------+
1 row in set (0.00 sec)
mysql>
HEX(N_or_S)
N_or_S 가 숫자이면 16 진수로 표현한 문자열을 가져오고, N_or_S 가 문자열이면 16 진수 숫자를 가져온다.
mysql> select hex(255), hex('abc'); +----------+------------+ | hex(255) | hex('abc')| +----------+------------+ | FF | 616263 | +----------+------------+ 1 row in set (0.00 sec) mysql>
CHAR(N, ...)
아스키 코드 값 N 을 문자로 변환한 뒤 합쳐서 하나의 문자열을 가져온다.
mysql> select char(77,121,83,81,76); +-----------------------+ | char(77,121,83,81,76) | +-----------------------+ | MySQL | +-----------------------+ 1 row in set (0.00 sec) mysql>
CONCAT(str1, str2, ...)
문자열을 합친다. str 이 숫자형인 경우 문자형으로 변환한 뒤 합친다.
mysql> select concat('My','S','QL'); +-----------------------+ | concat('My','S','QL') | +-----------------------+ | MySQL | +-----------------------+ 1 row in set (0.00 sec) mysql>
CONCAT_WS(separator, srt1, str2, ...)
문자열 사이에 구분자를 두어 합친다.
mysql> select concat_ws('_','MySQL','Database'); +-----------------------------------+ | concat_ws('_','MySQL','Database') | +-----------------------------------+ | MySQL_Database | +-----------------------------------+ 1 row in set (0.01 sec) mysql>
LENGTH(str)혹은
OCTET_LENGTH(str) 혹은 CHAR_LENGTH(str) 혹은 CHARACTER_LENGTH(str) 문자열의 길이를 가져온다.
mysql> select length('text'); +----------------+ | length('text') | +----------------+ | 4 | +----------------+ 1 row in set (0.00 sec) mysql>
BIT_LENGTH(str)
문자열의 길이를 bit 값으로 가져온다.
mysql> select bit_length('text'); +--------------------+ | bit_length('text') | +--------------------+ | 32 | +--------------------+ 1 row in set (0.00 sec) mysql>
LOCATE(substr,str) 혹은 POSITION(substr IN str)
str 에서 substr 이 처음 나타나는 지점의 위치를 가져온다.
mysql> select locate('bar','foobarbar'); +---------------------------+ | locate('bar','foobarbar') | +---------------------------+ | 4 | +---------------------------+ 1 row in set (0.11 sec) mysql>
LOCATE(substr, str, pos)
str 에서 pos 위치부터 시작해서 substr 이 처음 나타나는 지점의 위치를 가져온다.
mysql> select locate('bar','foobarbar',5); +-----------------------------+ | locate('bar','foobarbar',5) | +-----------------------------+ | 7 | +-----------------------------+ 1 row in set (0.00 sec) mysql>
INSTR(str, substr)
str 에서 substr 이 처음 나타나는 지점의 위치를 가져온다. 인자 순서만 바뀌었을 뿐 LOCATE(substr,str) 와 기능은 같다.
mysql> select instr('foobarbar','bar'); +--------------------------+ | instr('foobarbar','bar') | +--------------------------+ | 4 | +--------------------------+ 1 row in set (0.00 sec) mysql>
LPAD(str, len, padstr)
문자열이 len 만큼 길이가 될 때까지 str 의 왼쪽에 padstr 을 계속 붙인다.
mysql> select lpad('hi',4,'??'); +-------------------+ | lpad('hi',4,'??') | +-------------------+ | ??hi | +-------------------+ 1 row in set (0.00 sec) mysql>
RPAD(str, len, padstr)
문자열이 len 만큼 길이가 될 때까지 str 의 오른쪽에 padstr 을 계속 붙인다.
mysql> select rpad('hi',5,'?'); +------------------+ | rpad('hi',5,'?') | +------------------+ | hi??? | +------------------+ 1 row in set (0.00 sec) mysql>
LEFT(str, len)
str 문자열에서 len 길이만큼 왼쪽부터 잘라서 가져온다.
mysql> select left('foobarbar',5); +---------------------+ | left('foobarbar',5) | +---------------------+ | fooba | +---------------------+ 1 row in set (0.00 sec) mysql>
RIGHT(str, len)
str 문자열에서 len 길이만큼 오른쪽부터 잘라서 가져온다.
mysql> select right('foodbarbar',4); +-----------------------+ | right('foodbarbar',4) | +-----------------------+ | rbar | +-----------------------+ 1 row in set (0.00 sec) mysql>
SUBSTRING(str, pos, len) 혹은 SUBSTRING(str FROM pos FOR len) 혹은 MID(str, pos, len)
문자열 str 에서 pos 위치부터 len 길이만큼 잘라낸다.
mysql> select substring('Quadratically',5,6); +--------------------------------+ | substring('Quadratically',5,6) | +--------------------------------+ | ratica | +--------------------------------+ 1 row in set (0.00 sec) mysql>
SUBSTRING(str, pos) 혹은 SUBSTRING(str FROM pos)
문자열 str 에서 pos 위치부터 끝까지 문자를 잘라낸다.
mysql> select substring('Quadratically',5); +------------------------------+ | substring('Quadratically',5) | +------------------------------+ | ratically | +------------------------------+ 1 row in set (0.00 sec) mysql>
SUBSTRING_INDEX(str, delim, count)
문자열 str 에서 구분자 delim 의 count 번째 위치만큼 잘라낸다. count 가 양수이면 문자열의 왼쪽에서 부터 delim 의 순서를 세고, count 가 음수이면 문자열의 오른쪽에서 부터 delim의 순서를 센다.
mysql> select substring_index('www.mycql.com','.',2); +----------------------------------------+ | substring_index('www.mycql.com','.',2) | +----------------------------------------+ | www.mycql | +----------------------------------------+ 1 row in set (0.00 sec) mysql>
LTRIM(str)
문자열 왼쪽의 모든 공백을 제거한다.
mysql> select ltrim(' barabr'); +--------------------+ | ltrim(' barabr') | +--------------------+ | barabr | +--------------------+ 1 row in set (0.00 sec) mysql>
RTRIM(str)
문자열 오른쪽의 모든 공백을 제거한다.
mysql> select rtrim('barbar '); +--------------------+ | rtrim('barbar ') | +--------------------+ | barbar | +--------------------+ 1 row in set (0.00 sec) mysql>
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
문자열 str 로부터 양쪽으로 모든 remstr 문자열을 제거한다. remstr 이 지정되지 않으면 공백을 제거한다. [BOTH | LEADING | TRAILING] 은 옵션으로서 BOTH 는 문자열 양쪽, LEADING 은 문자열 왼쪽, TRAILING 은 문자열 오른쪽의 모든 remstr 문자열을 제거한다.
mysql> select trim(' bar '), trim('bar' from 'barfoobar'); +-----------------+------------------------------------+ | trim(' bar ') | trim('bar' from 'barfoobar') | +-----------------+------------------------------------+ | bar | foo | +-----------------+------------------------------------+ 1 row in set (0.00 sec) mysql>
SPACE(N)
N 길이만큼 공백을 가져온다.
mysql> select space(6); +----------+ | space(6) | +----------+ | | +----------+ 1 row in set (0.00 sec) mysql>
REPLACE(str, from_str, to_str)
문자열 str 에서 from_str 문자열을 to_str 문자열로 바꾼다. 한글과 같은 다중 바이트 문자에도 잘 적용된다.
mysql> select replace('www.mysql.com','w','Ww'); +------------------------------------+ | replace('www.mysql.com','w','Ww') | +------------------------------------+ | WwWwWw.mysql.com | +------------------------------------+ 1 row in set (0.00 sec) mysql>
REPEAT(str, count)
문자열 str을 count 번 반복하여 가져온다.
mysql> select repeat('MySQL',3); +-----------------------+ | repeat('MySQL',3) | +-----------------------+ | MySQLMySQLMySQL | +-----------------------+ 1 row in set (0.00 sec) mysql>
REVERSE(str)
문자열 str 을 거꾸로 읽어서 가져온다.
mysql> select reverse('abc'); +----------------+ | reverse('abc') | +----------------+ | cba | +----------------+ 1 row in set (0.00 sec) mysql>
INSERT(str, pos, len, newstr)
문자열 str 을 pos 위치부터 len 길이만큼 잘라낸 후 그 자리를 newstr 로 대체한다.
mysql> select insert('Quadratic',3,4,'what'); +--------------------------------+ | insert('Quadratic',3,4,'what') | +--------------------------------+ | Quwhattic | +--------------------------------+ 1 row in set (0.08 sec) mysql>
ELT(N, str1, str2 ,str3, ...)
str1, str2, str3, ... 중 N 번째 문자열을 가져온다. ELT() 함수는 FIELD() 함수와 상호 보완된다.
mysql> select elt(4,'ej','heja','hej','foo'); +--------------------------------+ | elt(4,'ej','heja','hej','foo') | +--------------------------------+ | foo | +--------------------------------+ 1 row in set (0.02 sec) mysql>
FIELD(str, str1, str2, str3, ...)
str1, str2, str3, ... 중 str 이 몇 번째 문자열 인가를 가져온다.
mysql> select field('ej','Hej','ej','Heja','hej','foo'); +-------------------------------------------+ | field('ej','Hej','ej','Heja','hej','foo') | +-------------------------------------------+ | 2 | +-------------------------------------------+ 1 row in set (0.08 sec) mysql>
FIND_IN_SET(str, strlist)
콤마(,) 로 구분된 문자열 strlist 에서 str 이 몇 번째 문자열 인가를 가져온다. 문자열 str 에 콤마가 들어가 있으면 제대로 동작하지 않는다.
mysql> select find_in_set('foo','he,my,foo,je,ke'); +--------------------------------------+ | find_in_set('foo','he,my,foo,je,ke') | +--------------------------------------+ | 3 | +--------------------------------------+ 1 row in set (0.02 sec) mysql>
LCASE(str) 혹은 LOWER(str)
문자열 str 은 소문자로 변환한다.
mysql> select lcase('MYSQL'); +-----------------+ | lcase('MYSQL') | +-----------------+ | mysql | +-----------------+ 1 row in set (0.02 sec) mysql>
UCASE(str) 혹은 UPPER(str)
문자열 str 을 대문자로 변환한다.
mysql> select ucase('mysql'); +----------------+ | ucase('mysql') | +----------------+ | MYSQL | +----------------+ 1 row in set (0.00 sec) mysql>
LOAD_FILE(file_name)
시스템 파일로부터 값을 읽어 들인다. 이 때 파일은 시스템에 존재해야 하며, file_name은 절대 경로로 표시되어야 한다. 또한 file 은 시스템의 읽기 권한이 있어야 하며 MySQL 사용자는 user 테이블의 FILE 권한이 있어야 한다. 이 조건들을 만족하지 못할 경우 NULL 을 가져온다.
QUOTE(str)
문자열 str 에 작은 따옴표 (') 가 들어 있으면 SQL 문장이 문법적으로 잘못될 수 있다. 예를 들어 INSERT 문에서 저장할 문자열 데이터에는 따옴표 (') 를 붙이는데 데이터 자체에 따옴표가 들어있는 경우 따옴표가 중복되어 INSERT 문이 제대로 실행되지 못한다. 그러한 경우를 방지하기 위해 QUOTE() 를 사용한다. QUOTE() 는 문자열에 작은 따옴표가 있으면 앞에 역슬레쉬 ()를 붙여서 작은 따옴표 문자(') 로 변환 시켜주는 함수이다.
mysql> select quote("mysql'df"); +-------------------+ | quote("mysql'df") | +-------------------+ | 'mysql'df' | +-------------------+ 1 row in set (0.00 sec) mysql>