文章目录

  • 一、前言
    • 1、表现形式
    • 2、出现错误的sql
  • 二、问题排查
    • 1、数据表结构
    • 2、错误推测
    • 3、最终原因
  • 三、解决方案
    • 1、更改数据结构
      • (1)表结构
      • (2)分别更新两个字段为 科学计数法 :2.251799813685248e15
    • 2、按位或上一个值

一、前言

这个问题也是比较奇怪的,明明设置的是varchar类型,但存储的结果却是科学计数法,这还了得,必须找一下原因了

1、表现形式

            [uuid] => 1460444056320623751784[log_time] => 2016-05-30 01:03:01[daily_nums] => 1.125899906842624e15

就是这个daily_nums字段,十分的奇怪。

2、出现错误的sql

update test set daily_nums_nums =pow(2,x) where 1 ;

此处的pow函数是求幂次方的,博主这里是求2的n次方。,对了,mysql版本是5.7

二、问题排查

1、数据表结构

       $sql = "CREATE TEMPORARY TABLE if not exists test (uuid varchar(32) NOT NULL PRIMARY KEY,`log_time` datetime NOT NULL ,`daily_nums` VARCHAR(100) NOT NULL DEFAULT '0',UNIQUE KEY `uuid` (`uuid`),KEY (log_time)) DEFAULT CHARSET utf8 COLLATE utf8_general_ci";

这里给出的是varchar(100)类型,没道理存不下小小十几位的数据才对,怪哉怪哉

2、错误推测

明明是varchar结果,为什么反而成大数了了呢,推测是两个可能

(1)数据库读出来是科学计数法
(2)数据库里面存储的就是科学计数法

答案是第二种

3、最终原因

此处应该是由于pow()这个函数的原因导致的,当2^50的时候,已经达到了15位,当51次方的时候,超过了15位,就记成了科学技术法

 2^ 50  = 5629499534213122^ 51 =  1.125899906842624e15

猜测也是有内部的数据结构导致的,类似于浮点型的精度问题,但是没找到具体的答案,这里不再深究。

参考php14位大数转化为科学计数法:php使用位运算来实现日留存的算法

三、解决方案

1、更改数据结构

更改字段为bigint即可,下面可以测试下,当插入科学计数法的时候,bigintvarchar的区别:

(1)表结构

     CREATE TABLE `temp_drr_test` (`uuid` varchar(32) NOT NULL,`daily_nums` bigint(20) NOT NULL DEFAULT '0',`weekly_nums` bigint(20) NOT NULL DEFAULT '0',`monthly_nums` bigint(20) NOT NULL DEFAULT '0',`test_nums` varchar(100) DEFAULT '',UNIQUE KEY `uuid` (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
daily_nums为bigint, test_nums为varchar

(2)分别更新两个字段为 科学计数法 :2.251799813685248e15

 mysql> select * from temp_drr_test;
+------+---------------------+---------------------+--------------+---------------------+
| uuid | daily_nums          | weekly_nums         | monthly_nums | test_nums           |
+------+---------------------+---------------------+--------------+---------------------+
| 1111 | 4611686018427387904 | 9223372036854775807 |            0 | 4611686018427387904 |
+------+---------------------+---------------------+--------------+---------------------+
1 row in set (0.00 sec)mysql> update temp_drr_test set daily_nums=2.251799813685248e15;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from temp_drr_test;
+------+------------------+---------------------+--------------+---------------------+
| uuid | daily_nums       | weekly_nums         | monthly_nums | test_nums           |
+------+------------------+---------------------+--------------+---------------------+
| 1111 | 2251799813685248 | 9223372036854775807 |            0 | 4611686018427387904 |
+------+------------------+---------------------+--------------+---------------------+
1 row in set (0.00 sec)mysql> update temp_drr_test set test_nums=2.251799813685248e15;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from temp_drr_test;
+------+------------------+---------------------+--------------+----------------------+
| uuid | daily_nums       | weekly_nums         | monthly_nums | test_nums            |
+------+------------------+---------------------+--------------+----------------------+
| 1111 | 2251799813685248 | 9223372036854775807 |            0 | 2.251799813685248e15 |
+------+------------------+---------------------+--------------+----------------------+
1 row in set (0.00 sec)

最终发现,当字段为bigint的时候,是可以自动调节为数字的。只不过bigint能存储的长度也有限,难保不会超过,所以用下一个方法

2、按位或上一个值

update test set daily_nums =pow(2,x) | 0

这里选择0,这样在保证值不变的情况下,也能正常存储了,经测试无误,可以存储为大数。

end

mysql存储数据,varchar类型中的数据变成了科学计数法?相关推荐

  1. POI导入数据的过程中,遇到读取以科学计数法显示的数据

    在Poi读取Excel数据的过程当中,经常会因为用户操作的问题或是Excel的自动转换将单元格数据转换为科学计数法形式表现,那么这时在后台读取数据并进行校验数据格式的过程当中有可能就会出现错误,或者是 ...

  2. Oracle ERP 报表:类数字格式字符串数据的前置0被截取和被科学计数法表示

    在开发报表的时候,遇到了以下情况: A.问题描述 在PLSQL中编写程序输出HTML/XML格式的报表,在提交请求之后查看输出的时候,如果选择使用Excel打开,类似数字格式的字符串数据会被Excel ...

  3. 解决toad中number类型小数位数过长按科学计数法显示的问题

    在toad中->view->option->data->display large number in scientific notation,不选择该选项即可. (在pl/s ...

  4. 【C/C++】小数的输出 %e的用法 用科学计数法输出数据 %e输出00

    小数的输出 %e的用法 %e是printf的格式控制字符,用于指定浮点类型数据使用指数形式输出 浮点类型分为整数部分和小数部分,它们由点号.分隔,例如 0.0.75.0.4.023.0.27.-937 ...

  5. mysql科学计数法问题

    [java]  view plain  copy 在mysql数据库中,我这里遇到的,dynamic类型的数据,小数点后多余四位后会以科学计数法来进行表示 例如:20000.2342E2 首先这个问题 ...

  6. MySQL导出csv文件,数字过长出现科学计数法的问题

    原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重. 问题描述: 使用 MySQL 客户端工具导出 excel 数据,如果某个字段为纯数字,并且 length 过长,在导出的文件中,它就会以科 ...

  7. C#转换Excel表格中的科学计数法数字

    如图,如果从Excel中获取的数值是科学计数法格式则带有"E", 将其转换为一般数字类型需要先转为double格式.

  8. mysql varchar 中英文_MySQL5.1中varchar类型中文和英文长度的问题

    今天,也是突发奇想,在MySQL上验证varchar(15)会存15个中文,超过的会自动截取前15个. 一直抱守旧的观念(这种观念可能来源与s 今天,也是突发奇想,在MySQL上验证varchar(1 ...

  9. MySql学习之varchar类型

    MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定),在 MySQL5.0以上的版本中,varchar数据 ...

最新文章

  1. 网络工程师课程---4、网络层(网关是什么)
  2. 云计算灾备:灾备通识
  3. Memcached使用手册
  4. log4cxx编译过程–linux
  5. C语言中的字符和字符串
  6. 再送一波干货,测试2000线程并发下同时查询1000万条数据库表及索引优化
  7. 《编码规范和测试方法——C/C++版》作业 ·007——C++引入MySQL给C的API并简单封装
  8. 四大领域全面发力,腾讯云构筑全链路开发者服务体系
  9. 科技也能这么酷:无人驾驶轮椅要来啦
  10. 从主机 Windows 上无法远程访问 Linux 的 Tomcat 服务器解决方法
  11. Linux下常用网络配置命令
  12. 学生成绩管理系统(Java)
  13. 二元函数连续性知识点总结
  14. RK3568开发板固态硬盘测试
  15. 人工智能在音乐领域的应用概述(1)---听歌识曲
  16. 前端实现从视频中抽离出音频
  17. 关于elementui的table固定高度出现的表格高度有空缺
  18. 一键实现前程无忧(51job)简历不停刷新(selenium)
  19. 红米note3图片剪裁bug
  20. php 微信获取门店列表,【转载】微信公众号获取用户地理位置并列出附近的门店...

热门文章

  1. java aio事件模型_IO模型之AIO代码及其实践详解
  2. static在内存层面的作用_「C++ Primer plus 心得」9.内存模型和名称空间
  3. mnn c++ windows 调用实例
  4. python meshgrid()理解
  5. “EncoderDecoder: ‘mit_b1 is not in the backbone registry‘“
  6. namespace nvinfer1
  7. Package xxx is not available, but is referred to by another package
  8. KNN、MOG2和GMG
  9. pytorch cpu gpu性能对比
  10. 如何使用facenet