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
반응형