婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 解析MySQL隱式轉(zhuǎn)換問題

解析MySQL隱式轉(zhuǎn)換問題

熱門標簽:銷售語音電話機器人 常州網(wǎng)絡外呼系統(tǒng)開發(fā) 萊西市地圖標注 安徽ai電話電銷機器人有效果嗎 在哪里申請400電話 400電話申請信用卡 巫師三血與酒地圖標注 走過哪個省地圖標注 外呼系統(tǒng)電銷受騙

一、問題描述

root@mysqldb 22:12: [xucl]> show create table t1\G
*************************** 1. row ***************************
 Table: t1
Create Table: CREATE TABLE `t1` (
 `id` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
 
root@mysqldb 22:19: [xucl]> select * from t1;
+--------------------+
| id   |
+--------------------+
| 204027026112927605 |
| 204027026112927603 |
| 2040270261129276 |
| 2040270261129275 |
| 100  |
| 101  |
+--------------------+
6 rows in set (0.00 sec)

奇怪的現(xiàn)象:

root@mysqldb 22:19: [xucl]> select * from t1 where id=204027026112927603;
+--------------------+
| id   |
+--------------------+
| 204027026112927605 |
| 204027026112927603 |
+--------------------+
2 rows in set (0.00 sec)
640?wx_fmt=jpeg

什么鬼,明明查的是204027026112927603,為什么204027026112927605也出來了

二、源碼解釋

堆棧調(diào)用關系如下所示:

其中JOIN::exec()是執(zhí)行的入口,Arg_comparator::compare_real()是進行等值判斷的函數(shù),其定義如下

int Arg_comparator::compare_real()
{
 /*
 Fix yet another manifestation of Bug#2338. 'Volatile' will instruct
 gcc to flush double values out of 80-bit Intel FPU registers before
 performing the comparison.
 */
 volatile double val1, val2;
 val1= (*a)->val_real();
 if (!(*a)->null_value)
 {
 val2= (*b)->val_real();
 if (!(*b)->null_value)
 {
 if (set_null)
 owner->null_value= 0;
 if (val1  val2) return -1;
 if (val1 == val2) return 0;
 return 1;
 }
 }
 if (set_null)
 owner->null_value= 1;
 return -1;
}

比較步驟如下圖所示,逐行讀取t1表的id列放入val1,而常量204027026112927603存在于cache中,類型為double類型(2.0402702611292762E+17),所以到這里傳值給val2后val2=2.0402702611292762E+17。

當掃描到第一行時,204027026112927605轉(zhuǎn)成doule的值為2.0402702611292762e17,等式成立,判定為符合條件的行,繼續(xù)往下掃描,同理204027026112927603也同樣符合

如何檢測string類型的數(shù)字轉(zhuǎn)成doule類型是否溢出呢?這里經(jīng)過測試,當數(shù)字超過16位以后,轉(zhuǎn)成double類型就已經(jīng)不準確了,例如20402702611292711會表示成20402702611292712(如圖中val1)

MySQL string轉(zhuǎn)成double的定義函數(shù)如下:

{
 char buf[DTOA_BUFF_SIZE];
 double res;
 DBUG_ASSERT(end != NULL  ((str != NULL  *end != NULL) ||
    (str == NULL  *end == NULL)) 
  error != NULL);

 res= my_strtod_int(str, end, error, buf, sizeof(buf));
 return (*error == 0) ? res : (res  0 ? -DBL_MAX : DBL_MAX);
}

真正轉(zhuǎn)換函數(shù)my_strtod_int位置在dtoa.c(太復雜了,簡單貼個注釋吧)

/*
 strtod for IEEE--arithmetic machines.
 
 This strtod returns a nearest machine number to the input decimal
 string (or sets errno to EOVERFLOW). Ties are broken by the IEEE round-even
 rule.
 
 Inspired loosely by William D. Clinger's paper "How to Read Floating
 Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].
 
 Modifications:
 
 1. We only require IEEE (not IEEE double-extended).
 2. We get by with floating-point arithmetic in a case that
 Clinger missed -- when we're computing d * 10^n
 for a small integer d and the integer n is not too
 much larger than 22 (the maximum integer k for which
 we can represent 10^k exactly), we may be able to
 compute (d*10^k) * 10^(e-k) with just one roundoff.
 3. Rather than a bit-at-a-time adjustment of the binary
 result in the hard case, we use floating-point
 arithmetic to determine the adjustment to within
 one bit; only in really hard cases do we need to
 compute a second residual.
 4. Because of 3., we don't need a large table of powers of 10
 for ten-to-e (just some small tables, e.g. of 10^k
 for 0 = k = 22).
*/

既然是這樣,我們測試下沒有溢出的案例

root@mysqldb 23:30: [xucl]> select * from t1 where id=2040270261129276;
+------------------+
| id  |
+------------------+
| 2040270261129276 |
+------------------+
1 row in set (0.00 sec)
 
root@mysqldb 23:30: [xucl]> select * from t1 where id=101;
+------+
| id |
+------+
| 101 |
+------+
1 row in set (0.00 sec)

結果符合預期,而在本例中,正確的寫法應當是

root@mysqldb 22:19: [xucl]> select * from t1 where id='204027026112927603';
+--------------------+
| id   |
+--------------------+
| 204027026112927603 |
+--------------------+
1 row in set (0.01 sec)

三、結論

避免發(fā)生隱式類型轉(zhuǎn)換,隱式轉(zhuǎn)換的類型主要有字段類型不一致、in參數(shù)包含多個類型、字符集類型或校對規(guī)則不一致等

隱式類型轉(zhuǎn)換可能導致無法使用索引、查詢結果不準確等,因此在使用時必須仔細甄別

數(shù)字類型的建議在字段定義時就定義為int或者bigint,表關聯(lián)時關聯(lián)字段必須保持類型、字符集、校對規(guī)則都一致

最后貼一下官網(wǎng)對于隱式類型轉(zhuǎn)換的說明吧

1、If one or both arguments are NULL, the result of the comparison is NULL, except for the NULL-safe
=> equality comparison operator. For NULL => NULL, the result is true. No conversion is needed.
2、If both arguments in a comparison operation are strings, they are compared as strings.
3、If both arguments are integers, they are compared as integers.
4、Hexadecimal values are treated as binary strings if not compared to a number.
5、If one of the arguments is a TIMESTAMP or DATETIME column and the other argument is a
constant, the constant is converted to a timestamp before the comparison is performed. This is
done to be more ODBC-friendly. This is not done for the arguments to IN(). To be safe, always
use complete datetime, date, or time strings when doing comparisons. For example, to achieve best
results when using BETWEEN with date or time values, use CAST() to explicitly convert the values to
the desired data type.
A single-row subquery from a table or tables is not considered a constant. For example, if a subquery
returns an integer to be compared to a DATETIME value, the comparison is done as two integers.
The integer is not converted to a temporal value. To compare the operands as DATETIME values,
use CAST() to explicitly convert the subquery value to DATETIME.
6、If one of the arguments is a decimal value, comparison depends on the other argument. The
arguments are compared as decimal values if the other argument is a decimal or integer value, or as
floating-point values if the other argument is a floating-point value.
7、In all other cases, the arguments are compared as floating-point (real) numbers.

總結

以上所述是小編給大家介紹的MySQL隱式轉(zhuǎn)換,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

您可能感興趣的文章:
  • mysql查詢的時候給字段賦默認值操作
  • 詳解Mysql數(shù)據(jù)庫date, datetime類型設置0000-00-00默認值(default)報錯問題
  • MySQL5.7中的sql_mode默認值帶來的坑及解決方法
  • mysql中datetime類型設置默認值方法
  • MySQL命令行中給表添加一個字段(字段名、是否為空、默認值)
  • Mysql select語句設置默認值的方法
  • 解析MySQL設置當前時間為默認值的方法
  • MySQL表字段設置默認值(圖文教程及注意細節(jié))
  • Mysql 5.6 "隱式轉(zhuǎn)換"導致的索引失效和數(shù)據(jù)不準確的問題
  • MySQL的隱式類型轉(zhuǎn)換整理總結
  • MySQL 如何處理隱式默認值

標簽:果洛 黃石 河北 陽江 煙臺 鞍山 來賓 赤峰

巨人網(wǎng)絡通訊聲明:本文標題《解析MySQL隱式轉(zhuǎn)換問題》,本文關鍵詞  解析,MySQL,隱式,轉(zhuǎn)換,問題,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《解析MySQL隱式轉(zhuǎn)換問題》相關的同類信息!
  • 本頁收集關于解析MySQL隱式轉(zhuǎn)換問題的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产在线精品视频| 亚洲一二三四久久| 国产在线精品一区二区三区不卡 | 精品免费国产二区三区| 中文字幕av一区二区三区免费看| 欧美视频三区在线播放| 欧美精品一区二区三| 亚洲精品国久久99热| 精品一区二区三区在线播放视频| 日韩一区二区三区在线视频| 9i在线看片成人免费| 欧美精品一区二区三区在线播放 | 国产精品久久久久久久久搜平片 | 91激情五月电影| 成人97人人超碰人人99| 国模冰冰炮一区二区| 久久机这里只有精品| 欧美精品久久一区| 欧美日韩成人在线| 欧美二区三区91| 欧美日韩成人一区二区| 欧美绝品在线观看成人午夜影视| 色欲综合视频天天天| 在线精品国精品国产尤物884a| 91视频www| 亚洲视频在线观看三级| 国产精品对白交换视频| 亚洲欧美国产三级| 成人国产精品免费| 成人精品视频一区| 在线观看国产日韩| 91精品婷婷国产综合久久竹菊| 麻豆精品在线播放| 久久av中文字幕片| 成人性生交大片免费看中文| 波多野结衣中文字幕一区二区三区| 成人午夜激情片| 欧美亚州韩日在线看免费版国语版| 欧美日韩国产小视频| 日韩免费视频一区二区| 国产精品夜夜嗨| av亚洲精华国产精华精华| 色8久久人人97超碰香蕉987| 色欧美日韩亚洲| 欧美一级久久久久久久大片| 久久婷婷久久一区二区三区| 亚洲天堂免费看| 亚洲一区自拍偷拍| 亚洲影视在线播放| 久久 天天综合| 成人av网址在线| 欧美日韩国产123区| 欧美大肚乱孕交hd孕妇| 国产精品成人在线观看| 亚洲成人精品在线观看| 韩国欧美一区二区| 在线观看一区不卡| 国产色综合久久| 石原莉奈在线亚洲二区| 高清视频一区二区| 日韩美女啊v在线免费观看| 亚洲天天做日日做天天谢日日欢 | 日韩理论片一区二区| 日韩欧美亚洲一区二区| 国产女主播一区| 亚洲国产成人av好男人在线观看| 国产在线播放一区二区三区| k8久久久一区二区三区| 5858s免费视频成人| 精品少妇一区二区三区在线播放| 亚洲九九爱视频| 国产盗摄一区二区| 日韩三级中文字幕| 亚洲欧美日韩国产成人精品影院| 久久精品国产秦先生| 欧美日韩一区久久| 成人午夜激情片| 久久久久免费观看| 成人免费视频视频| 9191成人精品久久| 亚洲一区精品在线| 91麻豆国产在线观看| 国产亚洲福利社区一区| 理论电影国产精品| 欧美一级久久久久久久大片| 亚洲成av人片观看| 色香色香欲天天天影视综合网| 欧美国产日产图区| 天天影视网天天综合色在线播放| 国产999精品久久久久久| 精品国产一区a| 看片的网站亚洲| 欧美一区二区三区性视频| 亚洲成人综合网站| 欧洲亚洲精品在线| 亚洲一区电影777| 99久久精品费精品国产一区二区| 久久久久88色偷偷免费| 国产一区二区三区蝌蚪| 精品福利av导航| 风间由美一区二区三区在线观看 | 欧美日本乱大交xxxxx| 亚洲欧美日韩一区二区| 在线看日本不卡| 五月激情综合婷婷| 欧美岛国在线观看| 国产 欧美在线| 国产精品黄色在线观看 | 精品免费国产一区二区三区四区| 久久精品二区亚洲w码| 久久色在线视频| 99免费精品视频| 亚洲综合久久av| 欧美精品一区二区三| 国产·精品毛片| 日本一区二区三区四区| 不卡av电影在线播放| 中文字幕一区av| 欧美久久久一区| 国产一区视频网站| 亚洲色图色小说| 日韩免费看的电影| 成人污污视频在线观看| 图片区小说区区亚洲影院| 久久蜜桃av一区精品变态类天堂| 91亚洲大成网污www| 日韩高清在线观看| 久久亚洲精品小早川怜子| 99麻豆久久久国产精品免费优播| 亚洲地区一二三色| 国产精品美女久久久久久久久久久 | 麻豆一区二区在线| 中文字幕亚洲综合久久菠萝蜜| 欧美日韩精品一区二区三区四区| 狠狠色综合日日| 亚洲国产精品久久艾草纯爱 | 国产99久久久精品| 日日嗨av一区二区三区四区| 中文字幕欧美三区| 欧美日韩另类一区| 粗大黑人巨茎大战欧美成人| 亚洲视频狠狠干| 久久色.com| 欧美一区二区视频在线观看| 色婷婷精品久久二区二区蜜臂av| 国产专区综合网| 日韩中文字幕麻豆| 一区二区欧美视频| 综合欧美一区二区三区| 亚洲精品一区二区精华| 欧美三电影在线| 色婷婷综合久久久中文字幕| 国产精品456露脸| 免费在线观看一区二区三区| 一区二区不卡在线视频 午夜欧美不卡在 | 午夜精品久久久久久久99水蜜桃| 国产精品你懂的| 欧美国产一区二区在线观看 | 蜜臀91精品一区二区三区| 怡红院av一区二区三区| 精品国产一区二区三区四区四 | 亚洲一级二级三级在线免费观看| 国产拍欧美日韩视频二区| 337p日本欧洲亚洲大胆色噜噜| 欧美一级日韩一级| 日韩一区和二区| 在线播放/欧美激情| 日韩片之四级片| 欧美国产日韩在线观看| 亚洲欧美国产毛片在线| 日本免费新一区视频| 国产乱淫av一区二区三区| 91免费看`日韩一区二区| 欧美精品日韩一本| 久久青草欧美一区二区三区| 国产精品理论片| 亚洲一区在线电影| 久久99精品久久久久婷婷| jizz一区二区| 8x8x8国产精品| 国产无人区一区二区三区| 一区二区三区中文在线观看| 热久久国产精品| 91亚洲国产成人精品一区二三| 欧美久久婷婷综合色| 国产精品传媒视频| 日本欧美一区二区| av亚洲精华国产精华精华| 日韩视频一区二区在线观看| 国产精品久久久久影院老司| 日精品一区二区| 91视频国产资源| 久久久国产午夜精品| 亚洲一区二区三区国产| 国产成人精品影视| 91精品欧美一区二区三区综合在| 欧美国产1区2区| 久久国产精品免费| 欧美调教femdomvk| 中文字幕中文乱码欧美一区二区|