Как скрыть значение некоторого столбца, используя SQL на MYSQL? - PullRequest
0 голосов
/ 06 августа 2020

У меня есть таблица с именем Employee в моей базе данных, структура которой показана ниже:

Id   email                      phone        name
1    user@gmail.com           +7845690001    Jonney
2    Nortex.zone@gmail.com    +7845690781    North

У меня есть некоторые данные, которые я хочу замаскировать, например от +7845690001 до +7845690***. Полная версия, как показано ниже.

Id   email                      phone        name
1    u**r@gmail.com           +7845690***    J****y
2    N*********e@gmail.com    +7845690***    N***h

Мне удалось сделать это для имени и телефона:

Select CONCAT(MID(phone, 1, LENGTH(phone) - 3), '***') as new_phone,
CONCAT(LEFT(name,1),REPEAT("*",LENGTH(name)-2),RIGHT(name,1)) as new_name from employee.

Как я могу сделать это для электронной почты?

Ответы [ 4 ]

0 голосов
/ 06 августа 2020

REGEXP_REPLACE также может помочь. Вот как это сделать для электронной почты :

SELECT REGEXP_REPLACE(email, '(?!^).(?=[^@]+@)', '*') AS masked_email
FROM Employee;

Объяснение:

(?! ^) Мы убеждаемся, что соответствующий символ не находится в начале строки, и таким образом мы пропускаем первый символ.

. соответствует заменяемому символу

(? = [^ @] + @) мы остановимся на последовательности, которая представляет собой любой символ, который НЕ является @, за которым следует @.

Каждый отдельный Символ, который совпадает между этими двумя, затем будет заменен функцией на * (третий параметр).

Для номера телефона я покажу гораздо более простое решение:

SELECT REGEXP_REPLACE(phone, '[0-9]{3}$', '***') AS masked_phone
FROM Employee;

[0-9] {3} соответствует ровно трем цифрам.

$ указывает, что они должны быть в конце строки.

Затем мы заменяем их тремя звездочками . Обратите внимание, что это решение предполагает, что вы всегда храните телефонные номера таким образом, чтобы они всегда заканчивались тремя цифрами. Так, например, если я введу телефон типа «555-55-55-55», ничего не будет замаскировано. Если вы не всегда вставляете телефоны, нормализованные в одном и том же формате, тогда вы должны подумать о чем-то более сложном (например, fetch di git - получить ноль или более нецифровых чисел - fetch di git - получить ноль или более нецифровых чисел - fetch di git - конец строки, затем замените все, что совпадает с тремя * -с). Примерно так:

SELECT REGEXP_REPLACE(phone, '[0-9][^0-9]*[0-9][^0-9]*[0-9][^0-9]*$', '***') AS masked_phone
FROM Employee;

Здесь [0-9] означает один di git, а [^ 0-9] * означает ноль или более нецифровых цифр. И, конечно же, то же самое можно упростить, сгруппировав di git и ноль или более нецифровых цифр в одну группу, которая затем повторяется ровно три раза:

SELECT REGEXP_REPLACE(phone, '([0-9][^0-9]*){3}$', '***') AS masked_phone
FROM Employee;

И для name , мы можем сделать следующее:

SELECT REGEXP_REPLACE(name, '(?!^).(?=.+$)', '*') AS masked_name
FROM Employee;

Итак, мы снова пропускаем первый символ, затем сопоставляем и заменяем каждый символ до последнего символа в строке.

ВАЖНО: В приведенных выше примерах мы сохраняем длину строк. Если вам нужна более высокая анонимность, вы можете получать данные по группам, а затем заменять нужную группу одним файлом *. Например, для электронной почты:

SELECT REGEXP_REPLACE(email, '^(.)(.)+([^@]@.+)$', '\\1*\\3') AS masked_email
FROM Employee;

Это заменит john@gmail.dom на j *n@gmail.dom и margareth@gmail.dom на m *h@gmail.dom. Таким образом, он также замаскировал длину. Пояснение:

^ - начало строки.

(.) - наша первая группа. Это одиночный символ

(.) + - вторая группа. Это один или несколько символов.

([^ @] @. +) - наша третья группа. Это один символ НЕ @, за которым следует @, за которым следует один или несколько символов (любые).

Мы заменяем его на \ 1 (первая группа), за которым следует один *, за которым следует по \ 3 (третья группа).

0 голосов
/ 06 августа 2020

Вы можете работать со строковыми функциями MySQL: LEFT(), RIGHT(), LENGTH(), REPEAT() и SUBSTRING_INDEX().

Я просто сделаю это для email:

WITH
input(Id,email,phone,name) AS (
          SELECT 1 , 'user@gmail.com'        ,'+7845690001','Jonney'
UNION ALL SELECT 2 , 'Nortex.zone@gmail.com' ,'+7845690781','North'
)
SELECT
  id
, -- the leftmost single character or "email"
    LEFT(email,1)
 -- repeat "*" for the length of the part of "email" before "@" minus 2
 || REPEAT('*',LENGTH(SUBSTRING_INDEX(email,'@',1))-2)
 -- the rightmost single character of the part of "email" before "@"
 || RIGHT(SUBSTRING_INDEX(email,'@',1),1)
 -- hard-wire "@"
 ||'@'
 -- the part of "email" from the end of the string back to "@"
 ||SUBSTRING_INDEX(email,'@',-1)
 AS email
FROM input
-- out  id |         email         
-- out ----+-----------------------
-- out   1 | u**r@gmail.com
-- out   2 | N*********e@gmail.com
-- out (2 rows)
0 голосов
/ 06 августа 2020

Наконец нашел ответ:

Select CONCAT(MID(phone, 1, LENGTH(phone) - 3), '***') as new_phone,
CONCAT(LEFT(name,1),REPEAT("*",LENGTH(name)-2),RIGHT(name,1)) as new_name,CONCAT(CONCAT(left(email,1),REPEAT("*",LENGTH(SUBSTRING_INDEX(email, "@", 1))-2),RIGHT(SUBSTRING_INDEX(email, "@", 1),1)),'@',SUBSTRING_INDEX(email,'@',-1)) as new_email from employee

Всем спасибо. :)

0 голосов
/ 06 августа 2020

Вы можете использовать функции CONCAT и SubSTRING в mysql. Электронная почта и имя имеют одинаковую функцию, используйте то же самое для имени и измените цифры в соответствии с вашими требованиями.

SELECT CONCAT(LEFT(`name`, 1),"***",RIGHT(`name`, 1)) as cname, CONCAT(LEFT(`email `, 1),"***",SUBSTRING(`email `, LOCATE("@", `email `)-1, LENGTH(`email `)-LOCATE("@", `email `)-1)) as cemail , CONCAT(LEFT(`phone`, 8),"***") as cphone FROM `test4` 

EDITTED -----------------

Для заполнения точным количеством символов вы можете использовать функцию LPAD. Для имени вы можете сделать:

SELECT CONCAT(LEFT(`name `,1),LPAD(RIGHT(`name `,1),LENGTH(`name `)-1,'*')) FROM `test4` 

Использовать LOCATE и изменять индексы на основе верхнего запроса для электронной почты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...