Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL || 연산자의 우선순위는 어떻게 될까? PIPES_AS_CONCAT SQL 모드와의 관계

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 모드를 활성화해야 의도한 대로 동작한다는 점을 기억해야 합니다.