身份证存进表格,后两位悄悄变了

经验 2026-10-09 20:02 · 45 次阅读 ·Excel,数据,踩坑,实测

一张名单表:眼睛看到的和程序读到的

背景

我把一张三行的名单表交给程序读,身份证号后两位变了。

表格很普通:姓名、身份证、手机号、工号,人眼看着一点问题都没有。程序读出来的身份证却是另一个数。

这篇记一下我实测到的三种变形,还有怎么躲开。

实测

先给结论:18 位身份证会变,11 位手机号不变,工号的 0012 会丢掉前面的零。

一、身份证末两位被改掉

我在表里按数字填了身份证 110101199003078515,程序读回来是 110101199003078512。

换一个再试:310101198512310017 读回来是 310101198512310016,末位 7 变成 6。

不是程序写错了。表格存数字能记准的上限是 15 位,像一把只有 15 个刻度的尺子,量 18 位长的东西,尾巴那几格只能估。18 位数字塞进去,末尾几位就被改掉了。

手机号 11 位,短于 15,塞得下,所以原样不变。这一点和我原先想的不一样,我本以为手机号也会坏。

表格文件里到底存了什么,我直接把文件解开看了,身份证那一格记的原文是 1.101011990030785e+17。

二、眼睛看到的 0012,程序读到 12

工号那一列,我给单元格贴了一个「显示成四位」的格式,屏幕上看着是 0012。

程序读出来是 12。

单元格格式只是给眼睛看的贴纸,不影响格子里存的内容。存的一直是 12,贴纸把它显示成 0012 而已。凡是靠「看一眼屏幕对不对」来验收数据的,这一条最容易漏。

三、导出 CSV 之后变形更明显

我把这张表的值原文照抄导出成 CSV,身份证那一列直接变成这样:

张三,1.101011990030785e+17,13800138000,12

一列里混着 21 个字符的科学计数法和正常数字。这份文件再往下传,后面每个环节都得重新猜这是什么。

四、顺手测的中文乱码

中文 CSV 有两种常见存法,我互相读了一遍。

存 GBK 的(中文版 Excel 另存为 CSV 就是这种),用 UTF-8 去读,报错原话是:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd0 in position 0: invalid continuation byte

反过来用 GBK 读就正常。

存 UTF-8 的文件,最前面加三个字节 EF BB BF(叫 BOM,等于告诉 Excel「我这份是 UTF-8」),用 Excel 打开中文就不乱;不加这三个字节,Excel 猜成 GBK,中文就是乱码。这个我也验了:没加标记的文件开头是 e5 a7 93(「姓」的 UTF-8 编码),加了标记的是 ef bb bf e5 a7 93。

结论与踩坑

  • 身份证、银行卡、订单号这种固定长度、超过 15 位的东西,一律当文字存,不当数字。手机号 11 位没出事,但我以后也一并当文字。
  • 当文字存的动作很简单:录入前先把整列设成文本格式,或者用程序写的时候直接写字符串再贴文本格式。这种写法我测过,文件里记的是 inlineStr(内联文字),读回来和原文一字不差。
  • 验收别只看屏幕,加一道位数检查:身份证读出来不是 18 位就报出来。我拿那张坏表跑,2 行全部被抓出来(读出来分别是 19 和 21 个字符)。三行代码,能省掉后面很多返工。
  • 表里已经有坏值的时候,改格式救不回来。变成浮点数那一刻后几位就没了,只能回头重新录一遍。
  • 中文 CSV 我以后一律存 UTF-8 带 BOM。

继续看

全部 →