MySQL에서 || 연산자의 우선순위와 PIPES_AS_CONCAT SQL 모드
MySQL에서 || 연산자는 기본적으로 논리 OR(logical OR) 연산자로 동작합니다. 하지만 이 동작 방식은 PIPES_AS_CONCAT SQL 모드 설정에 따라 달라집니다.
만약 PIPES_AS_CONCAT SQL 모드가 활성화되면, || 연산자는 문자열 연결(string concatenation) 연산자로 변경됩니다. 이때 해당 연산자의 우선순위는 ^(비트 XOR) 연산자와 단항 연산자(unary operator) 사이로 조정됩니다.
기본 상태: 논리 OR 연산자로 동작
아래 예제를 통해 기본 설정에서의 동작을 확인해 보겠습니다.
mysql> Set @C='tutorials'; Query OK, 0 rows affected (0.00 sec) mysql> Set @D='point'; Query OK, 0 rows affected (0.00 sec) mysql> Select @C||@D; +--------+ | @C||@D | +--------+ | 1 | +--------+ 1 row in set (0.00 sec)
위 쿼리의 결과를 보면 @C와 @D는 모두 NULL이 아닌 유효한 값이므로 참(true)으로 평가되어 결과값이 1로 반환되었습니다. 즉, ||가 논리 OR 연산자로 작동한 것입니다.
PIPES_AS_CONCAT 모드 활성화 후: 문자열 연결로 동작
이제 PIPES_AS_CONCAT SQL 모드를 활성화해 보겠습니다.
mysql> Set SQL_MODE = 'PIPES_AS_CONCAT'; Query OK, 0 rows affected (0.10 sec)
PIPES_AS_CONCAT SQL 모드가 활성화되면 || 연산자는 CONCAT() 함수의 동의어처럼 작동하며, 두 문자열을 하나로 연결하는 역할을 수행합니다. 아래 결과 집합에서 그 차이를 확인할 수 있습니다.
mysql> Select @C||@D; +----------------+ | @C||@D | +----------------+ | tutorialspoint | +----------------+ 1 row in set (0.00 sec)
정리
- 기본 모드:
||는 논리 OR 연산자로 동작하며, 피연산자가 참이면 1을 반환합니다. - PIPES_AS_CONCAT 활성화 시:
||는 문자열 연결 연산자로 동작하며, 우선순위는^연산자와 단항 연산자 사이가 됩니다.
따라서 Oracle 등 다른 데이터베이스에서 넘어온 개발자가 문자열 연결 목적으로 ||를 사용하려 한다면, 반드시 PIPES_AS_CONCAT SQL 모드를 활성화해야 의도한 대로 동작한다는 점을 기억해야 합니다.