본문으로 바로가기

[MySQL] 초성 검색 함수 생성, 활용

category 코딩/SQL_Query 2022. 10. 4. 14:31

한글에서 자음만 추출하는 MySQL 함수를 생성한다. 5.1.41 버전과 5.5.20 버전의 오래된 서버에서도 정상적으로 생성 되었다.

특수문자, 숫자, 공백 등의 문자는 조작하지 않는다.

 

 

위 링크는 동일 기능의 PHP 함수이다.

 

DELIMITER $$

USE `databasename`$$

DROP FUNCTION IF EXISTS `chosung`$$

CREATE DEFINER=`root`@`localhost` FUNCTION `chosung`(STR VARCHAR(255)) RETURNS VARCHAR(255) CHARSET utf8
BEGIN
  DECLARE I INT;
  DECLARE J INT;
  DECLARE TMPSTR VARCHAR(255);
  DECLARE COL1 VARCHAR(2);

  SET I = CHAR_LENGTH(STR);
  SET J = 1;
  SET TMPSTR = '';

  WHILE J <=I  DO
    SET COL1 = SUBSTRING(STR, J, 1);
    SET TMPSTR = CONCAT(TMPSTR,(
      CASE WHEN COL1 < 'ㄱ' THEN COL1
        WHEN ASCII('ㄱ') <= ASCII(COL1) AND ASCII(COL1)<= ASCII('ㅎ') THEN COL1 
        WHEN COL1 < '까' THEN 'ㄱ'
        WHEN COL1 < '나' THEN 'ㄲ'
        WHEN COL1 < '다' THEN 'ㄴ'
        WHEN COL1 < '따' THEN 'ㄷ'
        WHEN COL1 < '라' THEN 'ㄸ'
        WHEN COL1 < '마' THEN 'ㄹ'
        WHEN COL1 < '바' THEN 'ㅁ'
        WHEN COL1 < '빠' THEN 'ㅂ'
        WHEN COL1 < '사' THEN 'ㅃ'
        WHEN COL1 < '싸' THEN 'ㅅ'
        WHEN COL1 < '아' THEN 'ㅆ'
        WHEN COL1 < '자' THEN 'ㅇ'
        WHEN COL1 < '짜' THEN 'ㅈ'
        WHEN COL1 < '차' THEN 'ㅉ'
        WHEN COL1 < '카' THEN 'ㅊ'
        WHEN COL1 < '타' THEN 'ㅋ'
        WHEN COL1 < '파' THEN 'ㅌ'
        WHEN COL1 < '하' THEN 'ㅍ'
        WHEN COL1 <= '힣' THEN 'ㅎ'
        ELSE COL1
      END
  ));
  SET J = J + 1 ;
END WHILE;

RETURN TMPSTR;
END$$

DELIMITER ;

 

함수 생성 시도 시 아래 오류 메시지가 발생할 수 있다.

 

Error Message

ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

 

사용자 함수 생성에 관련한 서버 설정 때문인데, 아래 쿼리로 해결 가능하다.

 

SET GLOBAL log_bin_trust_function_creators = 1;

 

함수를 생성하고 테스트를 해 보자.

 

SELECT chosung('ㅇㅅㅅ ㅈㄱ'), chosung('이순신 장군')

 

결과는 둘 다 ㅇㅅㅅ ㅈㄱ 이다.

 

추가로 LIKE 에서 사용하려면, LIKE CONCAT('%', chosung('이순신 장군'), '%') 이렇게 CONCAT()을 활용한다.