mysql儲存資料,varchar型別中的資料變成了科學計數法?
文章目錄
一、前言
這個問題也是比較奇怪的,明明設定的是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 = 562949953421312
2^ 51 = 1.125899906842624e15
猜測也是有內部的資料結構導致的,類似於浮點型的精度問題,但是沒找到具體的答案,這裡不再深究。
參考php
的14
位大數轉化為科學計數法:php使用位運算來實現日留存的演算法
三、解決方案
1、更改資料結構
更改欄位為bigint
即可,下面可以測試下,當插入科學計數法的時候,bigint
和varchar
的區別:
(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: 0
mysql> 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: 0
mysql> 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資料型別操作(char與varchar)MySql資料型別
- JavaScript中的資料型別-儲存差別JavaScript資料型別
- 【YashanDB知識庫】kettle從DM8的number型別同步到YashanDB的varchar型別,存入是科學計數法形式的資料型別
- MySQL中資料型別(char(n)、varchar(n)、nchar(n)、nvarchar(n)的區別)MySql資料型別
- 資料型別,變數資料型別變數
- js基本語法之 值型別(資料型別)(變數型別)JS資料型別變數
- 重新學習Mysql資料庫3:Mysql儲存引擎與資料儲存原理MySql資料庫儲存引擎
- redis-4.資料儲存型別Redis型別
- SSIS 資料型別 第二篇:變數的資料型別資料型別變數
- Mysql 資料型別之整數型別MySQL 資料型別
- [20191219]oracle timestamp資料型別的儲存.txtOracle資料型別
- JavaScript中的變數、資料型別以及運算子JavaScript變數資料型別
- 二、變數與資料型別變數資料型別
- python—資料型別和變數Python資料型別變數
- mysql變長型別欄位varchar值更新變長或變短底層檔案儲存原理MySql型別
- Mybatis讀取和儲存json型別的資料MyBatisJSON型別
- MySQL 的資料型別MySql資料型別
- Oracle基本資料型別儲存格式淺析——RAW型別Oracle資料型別
- MySQL中資料型別的驗證MySql資料型別
- 資料科學求職建議:掌握5種型別的資料科學專案資料科學求職型別
- 分析 JavaScript 的資料型別與變數JavaScript資料型別變數
- MySQL儲存毫秒資料的方法MySql
- [Mysql]資料型別MySql資料型別
- MySQL資料型別MySql資料型別
- MYSQL 資料型別MySQL 資料型別
- Java檢視變數資料型別Java變數資料型別
- 強型別語言變數和資料型別的理解變數資料型別
- mysql整數資料型別深入解析MySql資料型別
- [20241009]oracle timestamp with time zone資料型別的儲存.txtOracle資料型別
- 學習變數的目的及基本資料型別介紹變數資料型別
- MySQL 更改資料庫資料儲存目錄MySql資料庫
- MySQL資料型別及sql模型及伺服器變數MySql資料型別模型伺服器變數
- 1-02:MySQL中的資料型別MySql資料型別
- mysql 常用的資料型別MySql資料型別
- Redis資料結構(一)-Redis的資料儲存及String型別的實現Redis資料結構型別
- sql學習(mysql)(1)資料型別MySql資料型別
- mysql資料庫中decimal資料型別比較大小MySql資料庫Decimal資料型別
- 人人都能學會的python程式設計教程2:資料型別和變數Python程式設計資料型別變數