본문 바로가기
C.W.K.
Stream
Lesson 10 of 10 · published

SQL, Unicode, 성능 노트

~8 min · sql, unicode, performance

Level 0패턴 호기심
0 XP0/90 lessons0/15 achievements
0/100 XP to next level100 XP to go0% complete

데이터베이스마다 정규식 연산자와 엔진이 달라

  • PostgreSQL: ~, ~*, !~, !~* 연산자를 제공하고 POSIX ERE를 확장한 ARE 방언을 사용해.
  • MySQL 8: REGEXPRLIKE를 제공하고 ICU 정규식 엔진을 사용해.
  • MariaDB: 연산자 이름은 비슷하지만 PCRE 계열 엔진과 버전별 설정을 사용하므로 MySQL과 같은 문법이라고 가정하면 안 돼.
  • SQLite: REGEXP를 사용하려면 확장을 불러오거나 사용자 정의 함수를 등록해야 해.
  • Snowflake: RLIKE, REGEXP_LIKE, REGEXP_SUBSTR, REGEXP_REPLACE 등을 제공해.

regexp_replace, regexp_substr, regexp_count처럼 비슷한 이름의 함수도 세부 인수와 방언은 다를 수 있어. 사용하는 데이터베이스 문서를 기준으로 확인해.

유니코드 입력은 축약 클래스의 차이를 드러내

  • Python re: 기본 \d, \w, \s는 유니코드를 인식하고 re.ASCII로 제한할 수 있어.
  • JavaScript: 유니코드 코드 포인트 처리를 위해 /u를 사용해도 \w는 ASCII 중심이야. 문자 범주에는 \p{L} 같은 속성 이스케이프를 써.
  • RE2와 Go: 축약 클래스는 ASCII 의미를 사용하고, 유니코드 범주는 \p{Nd}\pL처럼 적어.
  • PCRE: 유니코드 속성 의미에는 (*UCP)PCRE2_UCP가 필요하고, 비 ASCII 코드 포인트를 처리할 UTF 모드도 따로 확인해야 해.

유니코드 데이터를 다룬다면 ASCII 예시만 통과한 것으로 끝내지 말고 한글, 확장 숫자, 이모지 같은 실제 입력도 시험해.

성능은 패턴과 입력을 함께 보고 판단해

  1. 반복해서 쓸 패턴은 컴파일 결과를 재사용해.
  2. 시작 위치가 정해져 있다면 앵커나 전체 일치 API로 검색 범위를 줄여.
  3. 한 글자 후보는 a|b|c보다 [abc]처럼 문자 클래스로 표현해.
  4. (a+)+, (a|a)+, (.*)*처럼 모호한 반복이 겹치는 패턴은 파국적 백트래킹을 검사해.
  5. 큰 파일은 통째로 메모리에 올리지 말고 줄이나 조각 단위로 읽어. finditer가 결과를 지연 생성해도 입력 문자열 자체를 대신 스트리밍해 주지는 않아.

공통 개념을 익히되 실행 엔진을 잊지 마

패턴이 입력을 따라 이동한다는 기본 모형은 어디서나 통하지만, 지원 문법과 문자 범위는 엔진마다 달라. 먼저 호환성이 높은 문법으로 요구사항을 표현하고, 전용 기능이 필요해질 때 대상 엔진의 문서를 확인해.

Code

DB 정규식 예시·sql
-- PostgreSQL
SELECT * FROM users WHERE email ~ '^[\w.+-]+@example\.com$';
SELECT regexp_replace(name, '\s+', '_', 'g') FROM users;

-- MySQL
SELECT * FROM logs WHERE message REGEXP 'ERROR|WARN';
SELECT REGEXP_SUBSTR(url, '/api/v[0-9]+/[^/]+') FROM requests;

-- Snowflake
SELECT * FROM events WHERE payload RLIKE '"event_type":"(login|signup)"';
SELECT REGEXP_REPLACE(text, '[^\x20-\x7E]', '', 1, 0, 'g') FROM messages;

-- SQLite (REGEXP 함수 로드 필요)
SELECT * FROM logs WHERE level REGEXP '^(ERROR|FATAL)$';

External links

Exercise

코드에서 사용하는 정규식 하나를 골라 같은 로직을 PostgreSQL이나 직접 사용하는 데이터베이스의 SQL 쿼리로 옮겨 봐. 패턴 문법과 이를 감싸는 API가 어떻게 다른지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.