身份证作为中国公民的身份证明,其正确性至关重要。在数据处理中,经常需要对身份证进行验证。SQL 作为一种强大的数据库语言,提供了多种 来判断身份证是否正确。
计算身份证校验码
身份证校验码是身份证号码的后一位数字,由前 17 位数字计算得出。其算法如下:
sql
校验码 = (∑(i=1,17)Wi * xi) % 11
其中:
- xi 为第 i 位数字
- Wi 为第 i 位数字的权重,分别为 7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2
例如,身份证号码 130631198402173047,其校验码计算如下:
sql
校验码 = (7 * 1 + 9 * 3 + 10 * 0 + 5 * 6 + 8 * 3 + 4 * 1 + 2 * 1 + 1 * 9 + 6 * 8 + 3 * 4 + 7 * 0 + 9 * 2 + 10 * 1 + 5 * 7 + 8 * 3 + 4 * 0 + 2 * 4 + 1 * 7) % 11
= 30 % 11
= 7
验证身份证正确性
使用 SQL 验证身份证正确性,需要进行以下步骤:
sql
-- 计算身份证校验码
ALTER TABLE person ADD COLUMN check_digit AS (
CAST(
SUBSTRING(person_id, 1, 17) AS INTEGER
) * 7 +
CAST(
SUBSTRING(person_id, 2, 17) AS INTEGER
) * 9 +
CAST(
SUBSTRING(person_id, 3, 17) AS INTEGER
) * 10 +
CAST(
SUBSTRING(person_id, 4, 17) AS INTEGER
) * 5 +
CAST(
SUBSTRING(person_id, 5, 17) AS INTEGER
) * 8 +
CAST(
SUBSTRING(person_id, 6, 17) AS INTEGER
) * 4 +
CAST(
SUBSTRING(person_id, 7, 17) AS INTEGER
) * 2 +
CAST(
SUBSTRING(person_id, 8, 17) AS INTEGER
) * 1 +
CAST(
SUBSTRING(person_id, 9, 17) AS INTEGER
) * 6 +
CAST(
SUBSTRING(person_id, 10, 17) AS INTEGER
) * 3 +
CAST(
SUBSTRING(person_id, 11, 17) AS INTEGER
) * 7 +
CAST(
SUBSTRING(person_id, 12, 17) AS INTEGER
) * 9 +
CAST(
SUBSTRING(person_id, 13, 17) AS INTEGER
) * 10 +
CAST(
SUBSTRING(person_id, 14, 17) AS INTEGER
) * 5 +
CAST(
SUBSTRING(person_id, 15, 17) AS INTEGER
) * 8 +
CAST(
SUBSTRING(person_id, 16, 17) AS INTEGER
) * 4 +
CAST(
SUBSTRING(person_id, 17, 17) AS INTEGER
) * 2
) % 11;
-- 验证身份证正确性
SELECT
person_id,
CASE
WHEN check_digit = CAST(SUBSTRING(person_id, 18, 1) AS INTEGER)
THEN '正确'
ELSE '错误'
END AS valid
FROM person;
注意事项
需要注意的是:
- SQL 判断身份证是否正确仅适用于中国大陆身份证。
- 校验码与身份证号码中的第 17 位数字一致时,身份证不一定正确,还需进一步核对。
- 对于身份证中含有 X 的情况,需要将 X 替换为 10 进行计算。