sql身份证合法性校验
时间: 2024-08-23 12:00:33 浏览: 94
SQL中进行身份证号码的合法性校验,通常需要使用正则表达式来匹配身份证号码的格式。身份证号码分为15位和18位两种。15位的身份证号码是早期的身份证号码格式,全部由数字组成;18位的身份证号码则是现在的主流格式,包含17位数字加上最后一位校验码,校验码可能是0-9的数字或者字母X。
以下是一个使用正则表达式进行身份证号码校验的基本示例:
```sql
-- 15位身份证号码的校验
SELECT *
FROM your_table
WHERE your_id_card_column REGEXP '^[0-9]{15}$';
-- 18位身份证号码的校验
SELECT *
FROM your_table
WHERE your_id_card_column REGEXP '^[0-9]{17}([0-9]|X|x)$';
```
在上述SQL语句中,`your_table`是包含身份证号码字段的表名,`your_id_card_column`是该表中存储身份证号码的字段名。
但请注意,正则表达式只能校验身份证号码的格式,不能校验身份证号码是否真实存在。真实的身份证号码还需要符合地区编码和出生日期的合法性,以及最后一位校验码的正确性。完整的校验逻辑相对复杂,需要结合具体的业务场景进行。
相关问题
SQL语句 身份证号校验函数: 函数名称: check_id_is_right(id varchar)
身份证号码校验函数 `check_id_is_right` 主要在中国大陆用于验证输入的身份证号码是否符合中国居民身份证的规定格式和校验规则。中国的身份证号码由18位数字组成,分为前6位地区码、接下来8位出生日期码、第9位奇偶校验码和最后3位顺序码。校验过程通常涉及计算校验码,常见的有“18位校验码”和“刘辉算法”。
以下是一个基本的函数结构示例,它使用了一些基础的数学操作来检查身份证号码的合法性:
```sql
CREATE FUNCTION check_id_is_right(id VARCHAR(18))
RETURNS BOOLEAN
BEGIN
DECLARE sum INT DEFAULT 0;
DECLARE weight DECIMAL(1, 0) DEFAULT 1;
-- 检查身份证号码长度
IF LENGTH(id) != 18 THEN
RETURN FALSE;
END IF;
-- 分割并计算每一位的值
FOR i IN 1..17 DO
SET sum = sum + weight * (id REGEXP_REPLACE(i, '[^0-9]', '') - 4 * IF(ASCII(SUBSTRING(id, i, 1)) >= 55, 0, 1));
SET weight = weight * 2;
END FOR;
-- 计算第18位校验码
DECLARE expected_checkdigit INT;
SET expected_checkdigit = IF(sum MOD 11 = 0, 0, 11 - sum MOD 11);
-- 比较实际校验码与预期的校验码
IF id LIKE CONCAT('%', expected_checkdigit, '%') THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END;
```
这个函数假设输入的是标准的18位身份证号码格式,如果不符合,将返回`FALSE`。
身份证件号码校验规则sql
身份证件号码校验规则是指对身份证号码进行合法性校验,一般要求身份证号码必须符合国家规定的格式,并且校验位也要正确。
以下是身份证件号码校验规则的 SQL 代码示例:
```sql
-- 获取身份证号码的前 17 位数字
SELECT SUBSTR(id_card, 1, 17) AS id_card_17
FROM users;
-- 获取身份证号码的最后一位校验位
SELECT SUBSTR(id_card, 18, 1) AS id_card_check
FROM users;
-- 计算身份证号码的校验位
SELECT CASE
WHEN MOD(SUBSTR(id_card, 1, 1) * 7 + SUBSTR(id_card, 2, 1) * 9 + SUBSTR(id_card, 3, 1) * 10 + SUBSTR(id_card, 4, 1) * 5 + SUBSTR(id_card, 5, 1) * 8 + SUBSTR(id_card, 6, 1) * 4 + SUBSTR(id_card, 7, 1) * 2 + SUBSTR(id_card, 8, 1) * 1 + SUBSTR(id_card, 9, 1) * 6 + SUBSTR(id_card, 10, 1) * 3 + SUBSTR(id_card, 11, 1) * 7 + SUBSTR(id_card, 12, 1) * 9 + SUBSTR(id_card, 13, 1) * 10 + SUBSTR(id_card, 14, 1) * 5 + SUBSTR(id_card, 15, 1) * 8 + SUBSTR(id_card, 16, 1) * 4 + SUBSTR(id_card, 17, 1) * 2, 11) = 0 THEN '0'
WHEN MOD(SUBSTR(id_card, 1, 1) * 7 + SUBSTR(id_card, 2, 1) * 9 + SUBSTR(id_card, 3, 1) * 10 + SUBSTR(id_card, 4, 1) * 5 + SUBSTR(id_card, 5, 1) * 8 + SUBSTR(id_card, 6, 1) * 4 + SUBSTR(id_card, 7, 1) * 2 + SUBSTR(id_card, 8, 1) * 1 + SUBSTR(id_card, 9, 1) * 6 + SUBSTR(id_card, 10, 1) * 3 + SUBSTR(id_card, 11, 1) * 7 + SUBSTR(id_card, 12, 1) * 9 + SUBSTR(id_card, 13, 1) * 10 + SUBSTR(id_card, 14, 1) * 5 + SUBSTR(id_card, 15, 1) * 8 + SUBSTR(id_card, 16, 1) * 4 + SUBSTR(id_card, 17, 1) * 2, 11) = 1 THEN 'X'
ELSE CAST(11 - MOD(SUBSTR(id_card, 1, 1) * 7 + SUBSTR(id_card, 2, 1) * 9 + SUBSTR(id_card, 3, 1) * 10 + SUBSTR(id_card, 4, 1) * 5 + SUBSTR(id_card, 5, 1) * 8 + SUBSTR(id_card, 6, 1) * 4 + SUBSTR(id_card, 7, 1) * 2 + SUBSTR(id_card, 8, 1) * 1 + SUBSTR(id_card, 9, 1) * 6 + SUBSTR(id_card, 10, 1) * 3 + SUBSTR(id_card, 11, 1) * 7 + SUBSTR(id_card, 12, 1) * 9 + SUBSTR(id_card, 13, 1) * 10 + SUBSTR(id_card, 14, 1) * 5 + SUBSTR(id_card, 15, 1) * 8 + SUBSTR(id_card, 16, 1) * 4 + SUBSTR(id_card, 17, 1) * 2, 11) AS CHAR)
END AS id_card_check
FROM users;
-- 校验身份证号码的合法性
SELECT CASE
WHEN REGEXP_LIKE(id_card, '^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])([0-2][1-9]|[1-3]\d|4[0-6]|5[0-3])\d{3}([0-9]|X)$') AND SUBSTR(id_card, 18, 1) = (
SELECT CASE
WHEN MOD(SUBSTR(id_card, 1, 1) * 7 + SUBSTR(id_card, 2, 1) * 9 + SUBSTR(id_card, 3, 1) * 10 + SUBSTR(id_card, 4, 1) * 5 + SUBSTR(id_card, 5, 1) * 8 + SUBSTR(id_card, 6, 1) * 4 + SUBSTR(id_card, 7, 1) * 2 + SUBSTR(id_card, 8, 1) * 1 + SUBSTR(id_card, 9, 1) * 6 + SUBSTR(id_card, 10, 1) * 3 + SUBSTR(id_card, 11, 1) * 7 + SUBSTR(id_card, 12, 1) * 9 + SUBSTR(id_card, 13, 1) * 10 + SUBSTR(id_card, 14, 1) * 5 + SUBSTR(id_card, 15, 1) * 8 + SUBSTR(id_card, 16, 1) * 4 + SUBSTR(id_card, 17, 1) * 2, 11) = 0 THEN '0'
WHEN MOD(SUBSTR(id_card, 1, 1) * 7 + SUBSTR(id_card, 2, 1) * 9 + SUBSTR(id_card, 3, 1) * 10 + SUBSTR(id_card, 4, 1) * 5 + SUBSTR(id_card, 5, 1) * 8 + SUBSTR(id_card, 6, 1) * 4 + SUBSTR(id_card, 7, 1) * 2 + SUBSTR(id_card, 8, 1) * 1 + SUBSTR(id_card, 9, 1) * 6 + SUBSTR(id_card, 10, 1) * 3 + SUBSTR(id_card, 11, 1) * 7 + SUBSTR(id_card, 12, 1) * 9 + SUBSTR(id_card, 13, 1) * 10 + SUBSTR(id_card, 14, 1) * 5 + SUBSTR(id_card, 15, 1) * 8 + SUBSTR(id_card, 16, 1) * 4 + SUBSTR(id_card, 17, 1) * 2, 11) = 1 THEN 'X'
ELSE CAST(11 - MOD(SUBSTR(id_card, 1, 1) * 7 + SUBSTR(id_card, 2, 1) * 9 + SUBSTR(id_card, 3, 1) * 10 + SUBSTR(id_card, 4, 1) * 5 + SUBSTR(id_card, 5, 1) * 8 + SUBSTR(id_card, 6, 1) * 4 + SUBSTR(id_card, 7, 1) * 2 + SUBSTR(id_card, 8, 1) * 1 + SUBSTR(id_card, 9, 1) * 6 + SUBSTR(id_card, 10, 1) * 3 + SUBSTR(id_card, 11, 1) * 7 + SUBSTR(id_card, 12, 1) * 9 + SUBSTR(id_card, 13, 1) * 10 + SUBSTR(id_card, 14, 1) * 5 + SUBSTR(id_card, 15, 1) * 8 + SUBSTR(id_card, 16, 1) * 4 + SUBSTR(id_card, 17, 1) * 2, 11) AS CHAR)
END
) THEN '合法'
ELSE '不合法'
END AS id_card_validity
FROM users;
```
其中,`id_card` 是要验证的身份证号码字段。这个 SQL 代码示例可以获取身份证号码的前 17 位数字、最后一位校验位,计算身份证号码的校验位,并检查身份证号码是否符合国家规定的格式和校验位是否正确,最终返回身份证件号码的合法性。
阅读全文