개발/DB

[MySQL] 숫자, 영어, 한글 랜덤값 생성 쿼리

김알리 2023. 7. 15. 16:37
728x90
반응형

DB 데이터를 협력업체에 테스트 목적으로 제공해야하는 일이 생겼다.

고객들의 개인정보를 노출시키면 안되므로 이름, 이메일 등을 마스킹해야 했는데, 랜덤값을 생성하기 위해 아래 쿼리를 사용했다.

사용할 함수

  • CHAR(num): 숫자를 문자열로 변경해준다.
  • RAND(): 0과 1 사이의 랜덤한 숫자를 반환한다.
  • HEX(num|str): 숫자 혹은 문자열을 hex 문자열로 변경해준다.
  • UNHEX(str): hex 문자열을 기존의 문자열로 변경해준다.
  • FLOOR(float): 소수점 이하의 값을 내림하여 정수를 반환한다.
  • UUID(): 랜덤한 uuid 문자열을 반환한다
  • CONCAT(str, ...): 여러 문자열을 하나로 합쳐 반환한다.

 

숫자 랜덤값 만들기

x 이상 y 미만의 자연수를 반환하는 쿼리

SELECT FLOOR(RAND() * (y - x)) + x;

 

영어 랜덤값 만들기

대문자
SELECT CHAR(FLOOR(RAND() * 26) + 65);
소문자
SELECT CHAR(FLOOR(RAND() * 26) + 97);
혼합
SET @case = CASE FLOOR(RAND() * 2) WHEN 0 THEN 65 ELSE 97 END;
SELECT CHAR(FLOOR(RAND() * 26) + @case);

 

반응형

 

한글 랜덤값 만들기

UTF-8 한글 범위 설명
  • 가(EA B0 80) ~ 힣(ED 9E A3)
  • hex 숫자 3개가 합쳐져 있는 형태인데, 이를 세 부분으로 나눠서 보면 다음과 같다.
    • 1: EA ~ ED
    • 2: 최소 80, 최대 BF. 그러나 첫 숫자가 EA인 경우 B0 이상, ED인 경우 9E 이하.
    • 3: 최소 80, 최대 BF. 그러나 첫 숫자 ED, 두번째 숫자 9E인 경우 최대 A3.
  • 따라서 아래 쿼리에서는 @first, @second, @third로 각 경우의 수를 핸들링 해주었다.
SET @first = FLOOR(RAND() * 4) + 234; 
SET @second = CASE @first 
    WHEN 234 THEN FLOOR(RAND() * 16) + 176 
    WHEN 237 THEN FLOOR(RAND() * 31) + 128 
    ELSE FLOOR(RAND() * 64) + 128 END; 
SET @third = CASE 
    WHEN @first = 237 AND @second = 158 THEN FLOOR(RAND() * 36) + 128 
    ELSE FLOOR(RAND() * 64) + 128 END; 

SELECT UNHEX(CONCAT(HEX(@first), HEX(@second), HEX(@third)));
  • 굳이 모든 한글 범위를 모두 사용할 필요가 없다면 다음과 같이 사용할 수도 있다.
SELECT UNHEX(CONCAT(
    HEX(FLOOR(RAND()*3) + 235), 
    HEX(FLOOR(RAND()*31) + 128), 
    HEX(FLOOR(RAND()*64) + 128)));
728x90
반응형