在mysql中判断身份证号是否符合规范

请教下在mysql中判断身份证号是否符合规范,并输出不符合规范的行,应该怎么写?如同在EXCEL中的判断公式:

img

类似这个效果,请指导

-- 建表
CREATE TABLE `test_id` ( `id` VARCHAR ( 18 ) NOT NULL, PRIMARY KEY ( `id` ) ); 
-- 初始化数据
INSERT INTO `test_id` VALUES ( '123456789123456789' ),( '432831196411150810' );
-- 检查是否通过
SELECT
    id,
    check_sum,
IF
    ( MID( id, 18, 1 )= check_sum, '通过', '不通过' ) result 
FROM
    (
    SELECT
        id,
    CASE
            mod_sum 
            WHEN 0 THEN
            '1' 
            WHEN 1 THEN
            '0' 
            WHEN 2 THEN
            'X' ELSE 12-mod_sum 
        END check_sum 
FROM
    (
    SELECT
        id,
        MOD (
            MID( id, 1, 1 )* 7 + MID( id, 2, 1 )* 9 + MID( id, 3, 1 )* 10 + MID( id, 4, 1 )* 5 + MID( id, 5, 1 )* 8 + MID( id, 6, 1 )* 4 + MID( id, 7, 1 )* 2 + MID( id, 8, 1 )* 1 + MID( id, 9, 1 )* 6 + MID( id, 10, 1 )* 3 + MID( id, 11, 1 )* 7 + MID( id, 12, 1 )* 9 + MID( id, 13, 1 )* 10 + MID( id, 14, 1 )* 5 + MID( id, 15, 1 )* 8 + MID( id, 16, 1 )* 4 + MID( id, 17, 1 )* 2,
            11 
        ) AS mod_sum 
    FROM
        test_id 
    ) temp 
    ) t;

img

你可以把公式先贴出来,然后帮你翻译

该回答引用GPTᴼᴾᴱᴺᴬᴵ
在MySQL中判断身份证号是否符合规范,可以使用正则表达式来匹配身份证号码的格式。一般来说,中国大陆的身份证号码有18位,其中前17位是数字,最后一位可能是数字或字母(X或x)。

以下是一个示例查询,可以查找不符合规范的身份证号码所在的行:

SELECT *
FROM 表名
WHERE 身份证号码 NOT REGEXP '^[1-9]\\d{16}[0-9Xx]$';


这个查询语句使用了正则表达式 ^[1-9]\d{16}[0-9Xx]$ 来匹配符合规范的身份证号码。其中:

  • ^ 表示开头;
  • [1-9] 表示第一位为非零数字;
  • \d{16} 表示后面16位为数字;
  • [0-9Xx] 表示最后一位为数字或字母X或x;
  • $ 表示结尾。

因此,这个正则表达式可以匹配符合规范的身份证号码。使用 NOT REGEXP 则表示不匹配该正则表达式,即查询出不符合规范的身份证号码所在的行。

如果需要指定某个表中的身份证号码字段进行查询,可以将 表名 替换为实际的表名,将 身份证号码 替换为实际的字段名即可。

需要注意的是,这个查询语句只能够筛选出身份证号码格式不符合规范的数据,并不能够验证身份证号码的真实性,因此在实际使用时需要慎重考虑。