# sql-faker **Repository Path**: artman/sql-faker ## Basic Information - **Project Name**: sql-faker - **Description**: 用 SQL 编写的在 MySQL/MariaDB 下的伪数据生成函数/过程库。 - **Primary Language**: SQL - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 34 - **Forks**: 0 - **Created**: 2019-06-27 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 生成数据库伪数据的 Faker -- SQL (MySQL/MariaDB) 版 ## 查看帮助 执行脚本后,用: ``` set names gb2312; select * from functions; ``` 查看各函数功能及用法。 ## 生成数据函数说明 | 序号 | 名称 | 返回值 | 功能 | 用法 | | ---- | ------------------------------------------------- | ------------------------------ | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | 1 | idno_sp(gender CHAR(2), min_age INT, max_age INT) | 可验证的中国身份证号 | 用于随机生成指定年龄段和性别的中国身份证号 | 参数 gender: 单个英文字符: “M”或“m”或“男”生成男性身份证号,其它生成女性身份证。min-age: 最小年龄;max-age: 最大年龄。 | | 2 | idno_g(gender CHAR(2)) | 可验证的中国身份证号 | 用于生成指定性别的 100 岁以内的中国身份证。 | 参数 gender: 单个英文字符: “M”或“m”或“男”生成男性身份证号,其它生成女性身份证。 | | 3 | idno() | 可验证的中国身份证号 | 用于随机生成任何性别任何年龄的合法的身份证号 | 本函数无参数,直接调用 idno() 即可。 | | 4 | gender() | 中文性别 | 用于随机生成中文性别 | 本函数无参数,直接调用 gender() 即可。 | | 5 | first_name(gender CHAR(1)) | 中文名字。 | 用于随机生成中文名字。 | 参数 gender,单个英文字符: “M”或“m”或“男”生成男性名字,其它生成女性名字。 | | 6 | last_name() | 中文姓氏。 | 用于随机获取中文姓氏。 | 本函数无参数,直接调用 last_name() 即可。 | | 7 | pname (gender CHAR(1)) | 中文姓名。 | 用于随机生成中文姓名。 | 参数 gender,单个英文字符: “M”或“m”或“男”生成男性姓名,其它生成女性姓名。 | | 8 | phone() | 中国大陆格式电话号码。 | 用于随机生成电话号码。 | 本函数无参数,直接调用 phone() 即可。 | | 9 | mobile() | 中国大陆格式手机号码。 | 用于生成手机号码。 | 本函数无参数,直接调用 mobile() 即可。 | | 10 | email() | 电邮地址。 | 用于生成合法的电邮地址。 | 本函数无参数,直接调用 email() 即可。 | | 11 | city() | 中国省市自治区直辖市首府城市。 | 用于随机获取中国省市自治区直辖市首府城市。 | 本函数无参数,直接调用 city() 即可。 | | 12 | address() | 中国格式地址。 | 用于生成中国格式地址。 | 本函数无参数,直接调用 address() 即可。 | | 13 | zip() | 邮政编码 | 生成中国大陆邮政编码 | 本函数无参数,直接调用 zip() 即可。 | | 14 | qq() | QQ 号。 | 用于随机生成 QQ 号。 | 本函数无参数,直接调用 qq() 即可。 | | 15 | wechat() | 微信号(手机格式) | 用于随机生成微信号。 | 本函数无参数,直接调用 wechat() 即可。 | | 16 | future(\_from INT, \_to INT, what CHAR(1)) | 未来某个日期。 | 用于生成未来某个日期。 | 参数-- \_from: 最小数目;\_to:最大数目;what: “Y” 表示年,“M”表示月,“D”表示天。 例如:future(3,10,"Y") 表示获取未来 3 到 10 年的任何一个日期。 | | 17 | past(\_from INT, \_to INT, what CHAR(1)) | 过去某个日期。 | 用于生成过去某个日期。 | 参数-- \_from: 最小数目;\_to:最大数目;what: “Y” 表示年,“M”表示月,“D”表示天。 例如:past(3,10,"Y") 表示获取 3 年前到 10 年的任何一个日期。 | ## 生成函数用例 1、idno_sp ``` -- 生成 18 到 60 岁的男性公民的身份证号 select faker.idno_sp('M',18,60); +--------------------------+ | faker.idno_sp('M',18,60) | +--------------------------+ | 519518198106270013 | +--------------------------+ 1 row in set (0.001 sec) ``` 2、idno_g ``` -- 获得1岁到100岁的女性公民的身份证号 select faker.idno_g(''); +--------------------+ | faker.idno_g('') | +--------------------+ | 387773201406270422 | +--------------------+ 1 row in set (0.001 sec) -- 获得1岁到100岁的男性公民的身份证号 select faker.idno_g('男'); +--------------------+ | faker.idno_g('男') | +--------------------+ | 115361197406270176 | +--------------------+ 1 row in set (0.000 sec) ``` 3、idno ``` -- 获得100岁以内任意合法的身份证号 select idno(); +--------------------+ | idno() | +--------------------+ | 483158199506270095 | +--------------------+ 1 row in set (0.001 sec) ``` 4、gender ``` -- 随机获得中文性别 select gender(); +----------+ | gender() | +----------+ | 男 | +----------+ 1 row in set (0.000 sec) ``` 5、first_name ``` -- 随机获得男性名字 select first_name('男'); +------------------+ | first_name('男') | +------------------+ | 昊天 | +------------------+ 1 row in set (0.000 sec) -- 随机获得女性名字 select first_name(''); +----------------+ | first_name('') | +----------------+ | 佩瑶 | +----------------+ 1 row in set (0.000 sec) ``` 6、last_name ``` -- 随机获得中文姓氏 select last_name(); +-------------+ | last_name() | +-------------+ | 崔 | +-------------+ 1 row in set (0.000 sec) ``` 7、pname ``` -- 随机获得女性全名 select pname(''); +-----------+ | pname('') | +-----------+ | 孟琚瑶 | +-----------+ 1 row in set (0.000 sec) -- 随机获得男性全名 select pname('m'); +------------+ | pname('m') | +------------+ | 张浩然 | +------------+ 1 row in set (0.000 sec) ``` 8、phone ``` -- 随机获得电话 select phone(); +---------------+ | phone() | +---------------+ | 0733-94549059 | +---------------+ 1 row in set (0.000 sec) ``` 9、mobile ``` -- 随机获得手机号码 select mobile(); +---------------+ | mobile() | +---------------+ | 180 8095 9257 | +---------------+ 1 row in set (0.000 sec) ``` 10、email ``` -- 随机获得电邮地址 select email(); +---------------------------+ | email() | +---------------------------+ | ssedluctus@guemassaes.com | +---------------------------+ 1 row in set (0.000 sec) ``` 11、city ``` -- 随机获取省、自治区、直辖市、港澳台的首府城市 select city(); +--------------+ | city() | +--------------+ | 山东省济南市 | +--------------+ 1 row in set (0.001 sec) ``` 12、address ``` -- 随机生成中国地址 select address(); +------------------------------+ | address() | +------------------------------+ | 内蒙古呼和浩特市雨泽街7935号 | +------------------------------+ 1 row in set (0.000 sec) ``` 13、zip ``` -- 随机生成中国大陆格式的邮政编码 select zip(); +--------+ | zip() | +--------+ | 184226 | +--------+ 1 row in set (0.000 sec) ``` 14、qq ``` -- 随机生成 QQ 号 select qq(); +-----------+ | qq() | +-----------+ | 220696835 | +-----------+ 1 row in set (0.000 sec) ``` 15、wechat ``` -- 随机生成微信号(手机号码) select wechat(); +--------------+ | wechat() | +--------------+ | 180 5534 900 | +--------------+ 1 row in set (0.000 sec) ``` 16、future ``` -- 测试日期: 2019-06-27 -- 获取未来 3 到 5 年区间的一个日期 select future(3,5,'Y'); +-----------------+ | future(3,5,'Y') | +-----------------+ | 2022-06-27 | +-----------------+ 1 row in set, 1 warning (0.000 sec) -- 获取未来 3 到 5 个月区间的一个日期 select future(3,5,'M'); +-----------------+ | future(3,5,'M') | +-----------------+ | 2019-09-27 | +-----------------+ 1 row in set, 1 warning (0.000 sec) -- 获取未来 3 到 5 天区间的一个日期 select future(3,5,'D'); +-----------------+ | future(3,5,'D') | +-----------------+ | 2019-06-30 | +-----------------+ 1 row in set, 1 warning (0.000 sec) -- 获取未来 3 到 5 天区间的一个日期(写颠倒也行) select future(5,3,'D'); +-----------------+ | future(5,3,'D') | +-----------------+ | 2019-07-02 | +-----------------+ 1 row in set, 1 warning (0.000 sec) ``` 17、past ``` -- 测试日期: 2019-06-27 -- 获得 7 到 10 年前的任何日期 select past(7,10,'Y'); +----------------+ | past(7,10,'Y') | +----------------+ | 2009-06-27 | +----------------+ 1 row in set, 1 warning (0.000 sec) -- 获得 7 到 10 个月前的任何日期 select past(7,10,'M'); +----------------+ | past(7,10,'M') | +----------------+ | 2018-08-27 | +----------------+ 1 row in set, 1 warning (0.000 sec) -- 获得 7 到 10 天前的任何日期 select past(7,10,'D'); +----------------+ | past(7,10,'D') | +----------------+ | 2019-06-20 | +----------------+ 1 row in set, 1 warning (0.000 sec) -- 获得 7 到 10 天前的任何日期(颠倒也行) select past(10,7,'D'); +----------------+ | past(10,7,'D') | +----------------+ | 2019-06-20 | +----------------+ 1 row in set, 1 warning (0.000 sec) ``` ## 辅助函数说明 | 序号 | 名称 | 返回值 | 功能 | 用法 | | ---- | ---------------------------------------- | -------- | ------------------------------ | ------------------------------------ | | 1 | date_from_id_helper(id_no VARCHAR(30)) | 日期 | 从给定的身份证号中取出出生日期 | 参数:身份证号(非法身份证号会报错) | | 2 | gender_from_id_helper(id_no VARCHAR(30)) | 中文性别 | 从给定的身份证号中取出性别 | 参数:身份证号(非法身份证号会报错) | ## 辅助函数用例 1、date_from_id_helper ``` -- 从身份证中获取出生日期 select idno(); +--------------------+ | idno() | +--------------------+ | 399683199506270324 | +--------------------+ 1 row in set (0.001 sec) select date_from_id_helper('399683199506270324'); +-------------------------------------------+ | date_from_id_helper('399683199506270324') | +-------------------------------------------+ | 1995-06-27 | +-------------------------------------------+ 1 row in set (0.000 sec) ``` 2、gender_from_id_helper ``` -- 从身份证号获得性别 select gender_from_id_helper('399683199506270324'); +---------------------------------------------+ | gender_from_id_helper('399683199506270324') | +---------------------------------------------+ | 女 | +---------------------------------------------+ 1 row in set (0.000 sec) ``` ## 脚本中包含的测试内容 ``` -- TEST CREATE TABLE `staff`( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `cid` CHAR(18) NOT NULL, `name` VARCHAR(50) NOT NULL, `gender` CHAR(2) NOT NULL, `birth_date` DATE NOT NULL, `hired_at` DATE NOT NULL, `conttact_due_at` DATE NOT NULL, `email` VARCHAR(100) NOT NULL, `work_phone` VARCHAR(50) NOT NULL, `mobile` VARCHAR(50), `qq` VARCHAR(50), `wechat` VARCHAR(50), `address` VARCHAR(200), `zip` CHAR(6), PRIMARY KEY (`id`) ); DELIMITER $$ CREATE PROCEDURE fill_fake_staff_data() BEGIN DECLARE _count INT; SET _count=1000; SELECT faker.gender() INTO @gender; SELECT faker.idno_sp(@gender,18,55) INTO @idno; WHILE _count>0 DO INSERT INTO `staff` VALUES ( NULL, -- id @idno, -- cid 身份证号 faker.pname(@gender), -- name 姓名 @gender, -- gender 性别 faker.date_from_id_helper(@idno), -- birth_date 出生日期 faker.past(3,10,'Y'), -- hired_date 雇用日期 faker.future(3,5,'Y'), -- contract_due_at 合同到期日期 faker.email(), -- email 电邮 faker.phone(), -- work_phone 工作电话 faker.mobile(), -- mobile 手机 faker.qq(), -- qq faker.wechat(), -- wechat 微信 faker.address(), -- address 住址 faker.zip() -- zip 邮编 ); SET _count=_count-1; END WHILE; END $$ DELIMITER ; CALL fill_fake_staff_data(); SET NAMES GB2312; -- 如果不在 Windows 下,或您的 Windows 控制台使用了 UTF8 编码,请注释掉此行。 SELECT COUNT(*) FROM `staff`; SELECT * FROM `staff` LIMIT 10; ```