2012-04-11 4 views
4

출력 데이터를 마스킹하는 내장 SQL 함수가 있습니까?MySQL 출력 마스킹 (전화 번호, SSN 등 표시 형식 지정)

전화 번호를 나타내는 정수 열이 있다고 가정 해 봅시다 (모든 국가에서). 하위 문자열을 구분하는 것, 해시, 대시 및 점을로드하는 것보다 번호를 표시하는 더 좋은 방법이 있습니까?

여러 언어에는 구조 조정 대신 데이터가 단순히 마스크되는 기능이 있다는 것을 알고 있습니다. MySQL과 비슷한 점이 있습니까?

답변

14

변경 사항이나 개선 사항이 있으면 의견을 남기고 코드를 업데이트합니다. 그렇지 않으면 당신이 그것을 좋아한다면, 그것을 부딪치지 마라. 즐겨!

DELIMITER // 

CREATE FUNCTION mask (unformatted_value BIGINT, format_string CHAR(32)) 
RETURNS CHAR(32) DETERMINISTIC 

BEGIN 
# Declare variables 
DECLARE input_len TINYINT; 
DECLARE output_len TINYINT; 
DECLARE temp_char CHAR; 

# Initialize variables 
SET input_len = LENGTH(unformatted_value); 
SET output_len = LENGTH(format_string); 

# Construct formated string 
WHILE (output_len > 0) DO 

SET temp_char = SUBSTR(format_string, output_len, 1); 
IF (temp_char = '#') THEN 
IF (input_len > 0) THEN 
SET format_string = INSERT(format_string, output_len, 1, SUBSTR(unformatted_value, input_len, 1)); 
SET input_len = input_len - 1; 
ELSE 
SET format_string = INSERT(format_string, output_len, 1, '0'); 
END IF; 
END IF; 

SET output_len = output_len - 1; 
END WHILE; 

RETURN format_string; 
END // 

DELIMITER ; 

가이 함수를 사용하는 방법은 ... 그것은 단지의 당신의 People 테이블 namelast, namefirstphone 필드가 있다고 가정 해 봅시다 (즉 SSN 박사 번호 등)

mysql> select mask(123456789,'###-##-####'); 
+-------------------------------+ 
| mask(123456789,'###-##-####') | 
+-------------------------------+ 
| 123-45-6789     | 
+-------------------------------+ 
1 row in set (0.00 sec) 

mysql> select mask(123456789,'(###) ###-####'); 
+----------------------------------+ 
| mask(123456789,'(###) ###-####') | 
+----------------------------------+ 
| (012) 345-6789     | 
+----------------------------------+ 
1 row in set (0.00 sec) 

mysql> select mask(123456789,'###-#!##@(###)'); 
+----------------------------------+ 
| mask(123456789,'###-#!##@(###)') | 
+----------------------------------+ 
| [email protected](789)     | 
+----------------------------------+ 
1 row in set (0.00 sec) 
+1

위대한 의견이었습니다. 간단한 형식 출력에 사용되었습니다. 고마워. –

1

예, MySQL은 형식 전원 가지고 : http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_format

을하지만 당신은 또한 거의 자신의 질문에 대답했습니다. MySQL은 다른 기준에 따라 포매터를 쉽게 작성할 수있는 동등한 힘을 가지고 있지 않습니다. 그것은 if 문과 함께 할 수 있지만 논리로 인해 SQL을 잘 읽는 것이 어렵습니다. 예를 들어, 국가 코드를 기반으로하는 포맷터를 사용하려는 경우 SQL 문에 많은 논리를 써야합니다.이 논리 문은 다른 언어 옵션을 사용할 수있는 경우에 가장 적합합니다. 결과를 파싱합니다.

3

정수 작동합니다.

SELECT p.namelast, p.namefirst,  
    CONCAT(SUBSTR(p.phone,1,3), '-', SUBSTR(p.phone,4,3), '-', SUBSTR(p.phone,7,4)) AS Telephone, 
FROM People p 

CONCAT은 (는 SUBSTR()) 세 번째 자리의 첫번째 위치의 필드 명, 두 번째 위치에 대한 문자 및 숫자를 사용한다. "AS 전화"를 사용하면 쿼리 출력에서 ​​열 머리글이 깨끗하게 유지됩니다.

주의 사항 : 저는 전화 번호, 주민 등록 번호 등에서 정수를 사용하지 말 것을 권장합니다. 그 이유는 아마도이 숫자로 숫자 계산을 수행하지 않을 것입니다. 이상한 기회가 당신을 promory key로 사용할 수는 있지만, 항상 0으로 시작하는 숫자로부터 숫자를 잃을 가능성이 있습니다.