【Mysql】不要用int类型存储11位手机号

这篇具有很好参考价值的文章主要介绍了【Mysql】不要用int类型存储11位手机号。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、遇到问题

今天在做添加数据的时候,发现手机号存储错误,报错信息是:

Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation:

Data truncation: Out of range value for column 'f_phone' at row 1;
Data truncation: Out of range value for column 'f_phone' at row 1;
nested exception is com.mysql.cj.jdbc.exceptions.MysqlDataTruncation:
Data truncation: Out of range value for column 'f_phone' at row 1]
with root cause
com.mysql.cj.jdbc.exceptions.MysqlDataTruncation:
Data truncation: Out of range value for column 'f_phone' at row 1

二、尝试解决

2.1 直接复制这个结果去找 ChatGPT ,它告诉我的是:

这个异常的意思是插入或更新语句中有一个字段(此处为 f_phone )的值超出了该列在数据库中定义的范围。

通常,字段值超出范围的原因有两种:一是字段值太长,导致无法存储在数据库中;二是字段值太大(或太小),超出了该列的数据类型和定义范围。

因此,您需要检查以下几点:

1.确认 f_phone 列的数据类型和长度是否与实际需要一致。如果该列的长度定义得太小,则可能会导致插入或更新时数据被截断。

2.检查插入或更新语句中 f_phone 列所对应的值是否符合数据库定义的类型和长度范围。

3.如果该字段是从表单传递过来的,请检查提交的表单中该字段的值是否正确,是否符合数据库定义的类型和长度限制。

同时,建议您在代码中添加一些正确性检查的函数,防止出现类似上述错误。例如,对于电话号码,可以编写一个验证函数,确保输入的电话号码符合规定的长度和格式等。

2.2 搜索其他网络资料整理得:

1)int是一种32位有符号整数类型,可以存储的范围是-2,147,483,648 ~ 2,147,483,647。因为int类型只有32位,所以能够表示的二进制数最大值为:231-1(在二进制下所有位均为1的情况下,对应的十进制数为231-1,
也就是 2147483647 )。

2)11位手机号码的十进制表示的最大值是1011-1 = 99999999999 。用二进制表示的话需要超过32位。因此,不能够用int类型来存储11位手机号码。

99999999999 的二进制表示需要超过36位。具体计算可以使用对数函数log2来得到。

可以使用以下公式来计算所需的位数:
位数 = log2(数值) + 1。在这里,数值是指要转换为二进制的十进制数。

对于99999999999,计算过程如下:

位数 = log2(99999999999) + 1 ≈ 36.55

因此,99999999999 的二进制表示需要超过36位。

2.3 综上所述,如果要存储一个11位的十进制数,我们需要使用更大的数据类型。

三、总结反思

我们在考虑 Mysql 存手机号用什么类型的时候,需要考虑以下几个方面:

  手机号码都是数字吗?

  都是中国的手机号码吗?

  会按照手机号等值查询吗?

  会按照手机号范围查询吗?

  需要手机号列唯一约束吗?


  如果是最简单的情况(中国手机号,11位数字),就用数值类型 bigint 存储即可,建索引。

  其他情况下,我们考虑三种类型存储手机号,BigInt,Char,Varchar,下面是它们各自的优劣势:

文章来源地址https://www.toymoban.com/news/detail-710490.html

  1. BigInt 可以存储非常大的整数,适用于超出其他整数类型范围的手机号码。它提供了准确且精确的存储。可以用来保存那些不包含小数点的数字。
    但是对于一些操作(如计算、排序等),BigInt 相较于其他类型可能会稍慢。
  2. Char 类型是固定长度的字符类型,适用于长度固定的手机号码。存储在 Char 类型中的数据在数据库中占用固定的存储空间,不会浪费空间。

    但是如果使用Char类型存储长度可变的手机号码,则会浪费存储空间。此外,对于可变长度的手机号码,插入和更新操作可能会变得复杂,需要手动控制长度。
  3. Varchar 通常用来表示最多为255个字符的变量长度字符串。如果你要储存和处理字母数字类的数据,这种数据类型是最合适的。适用于这类数据的典型例子包括人名,邮政编码,电话号码和不超过255个字符长度的任意字母数字组合。
    但是那些要用来计算的数字不要用 Varchar 类型保存,因为可能会导致一些与 计算相关的问题。换句话说,可能影响到计算的准确性和完整性。

到了这里,关于【Mysql】不要用int类型存储11位手机号的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序:登录授权,根据手机号获取凭证,获取用户手机号

    1.微信小程序授权 controller 层代码 wxUtils 工具类 2.微信小程序,用户手机号获取 微信小程序,根据code(code为手机号获取凭证)获取用户加密手机号 获取用户手机号方法

    2024年02月14日
    浏览(65)
  • 微信小程序 - 实现手机号登录--授权并获取手机号保存至本地

    微信官方文档 | 获取手机号 这是服务端的  这是我们前端获取手机号需要给接口传递的两个参数    注意: 参数一: 获取access_token需要用到小程序密钥,这个需要从 服务端获取 ,也就是需要请求后端接口获取access_token,千万不要将小程序密钥写在前端代码中, 必须 要从服

    2024年02月03日
    浏览(60)
  • 微信小程序手机号授权获取收费(手机号快速验证组件)剩余次数查看购买

    登录微信公众平台 ,在管理---》付费管理下查看,已用次数和剩余次数 该能力旨在帮助开发者向用户发起手机号申请,并且 必须经过用户同意后 ,开发者才可获得由平台验证后的手机号,进而为用户提供相应服务。 该能力与手机号实时验证组件的区别为: 手机号快速验证

    2024年02月22日
    浏览(77)
  • 【小程序】获取手机号报错:getPhoneNumber:fail no permission 【getPhoneNumber无法获取手机号】

    login.wxml  login.js 操作后控制台提示no permission   为保证用户隐私数据安全,调用getPhoneNumber方法,需要进行微信认证 (1)微信认证 需要企业账号,并付费300元 可参考:getPhoneNumber:fail no permission_在他乡奋斗的博客-CSDN博客 (2)开启微信测试号 方便我们在决定正式注册小程序

    2024年02月09日
    浏览(36)
  • java—手机号脱敏

    Java中手机号脱敏是指将真实手机号码中的一部分数字用特定字符替换,以保护用户的个人信息。通常,手机号码脱敏会将手机号的中间几位或者最后几位替换成特定字符,例如用“*”、\\\"X\\\"或者其他随意选择的字符来代替。 手机号脱敏的目的是防止用户个人信息外泄。在互联

    2024年02月11日
    浏览(42)
  • 【手机号验证/前端】Vue2+elementUI编写一个手机号验证码登录页面,路由式开发(附完整代码)

    目录 效果图: 一、template部分 二、style样式 三、script部分 1.先对手机号的格式进行一个判断 2.接下来就是表单验证规则rules 3.最后就是methods了 (1)首先我们给获取验证码绑定一个方法 (2)然后封装一个axios接口,方便后面测试联调(这部分每个人封装的都不一样) (3)然

    2024年02月17日
    浏览(55)
  • 小程序获取用户手机号

    通过获取用户手机号,可以省去很多操作,是比较常见的功能。 获取用户手机号码 分为以下几步: 第一点击页面获取授权按钮 第二获取用户授权参数 第三根据加解密算法解密手机号码 需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 b

    2024年02月11日
    浏览(45)
  • 手机号一键授权登录页面

        源码地址:https://ext.dcloud.net.cn/plugin?id=12272

    2024年02月03日
    浏览(52)
  • UNIAPP手机号一键登录

    使用uniapp实现移动端手机号一键登录功能。 uni一键登录 是DCloud联合个推公司推出的,整合了三大运营商网关认证能力的服务。 通过运营商的底层SDK,实现App端无需短信验证码直接获取手机号,也就是很多主流App都提供的一键登录功能 首先需要登录DCloud开发者中心,申请开通

    2023年04月22日
    浏览(35)
  • 微信小程序获取手机号

    1、先新建vue页面  打开看到页面是下图 在method定义方法    源码: node.js文件下载解压后启动node app.js打开服务器即可 点击下载

    2024年02月02日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包