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

主頁 > 知識庫 > MySQL令人大跌眼鏡的隱式轉換

MySQL令人大跌眼鏡的隱式轉換

熱門標簽:南京電銷外呼系統哪家好 外呼系統會封嗎 股票配資電銷機器人 電銷機器人 深圳 地圖標注如何弄全套標 在電子版地圖標注要收費嗎 實體店地圖標注怎么標 萬利達綜合醫院地圖標注點 武漢AI電銷機器人

MySQL的隱式轉換

一、問題描述

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)
 
 select * from t1;
+--------------------+
| id                 |
+--------------------+
| 204027026112927605 |
| 204027026112927603 |
| 2040270261129276   |
| 2040270261129275   |
| 100                |
| 101                |
+--------------------+
6 rows in set (0.00 sec)

奇怪的現象:

select * from t1 where id=204027026112927603;
+--------------------+
| id                 |
+--------------------+
| 204027026112927605 |
| 204027026112927603 |
+--------------------+
2 rows in set (0.00 sec)


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

二、源碼解釋

堆棧調用關系如下所示:

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

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轉成doule的值為2.0402702611292762e17,等式成立,判定為符合條件的行,繼續往下掃描,同理204027026112927603也同樣符合

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

MySQL string轉成double的定義函數如下:

{
  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);
}


真正轉換函數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).
*/


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

select * from t1 where id=2040270261129276;
+------------------+
| id               |
+------------------+
| 2040270261129276 |
+------------------+
1 row in set (0.00 sec)
 
 select * from t1 where id=101;
+------+
| id   |
+------+
| 101  |
+------+
1 row in set (0.00 sec)

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

select * from t1 where id='204027026112927603';
+--------------------+
| id                 |
+--------------------+
| 204027026112927603 |
+--------------------+
1 row in set (0.01 sec)

三、結論

避免發生隱式類型轉換,隱式轉換的類型主要有字段類型不一致、in參數包含多個類型、字符集類型或校對規則不一致等
隱式類型轉換可能導致無法使用索引、查詢結果不準確等,因此在使用時必須仔細甄別
數字類型的建議在字段定義時就定義為int或者bigint,表關聯時關聯字段必須保持類型、字符集、校對規則都一致

最后貼一下官網對于隱式類型轉換的說明吧

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令人大跌眼鏡的隱式轉換的詳細內容,更多關于MySQL的隱式轉換的資料請關注腳本之家其它相關文章!,希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • MySQL如何實現事務的ACID
  • Mysql中事務ACID的實現原理詳解
  • MySQL非空約束(not null)案例講解
  • 解決mysql數據庫數據遷移達夢數據亂碼問題
  • MySQL連接異常報10061錯誤問題解決
  • MySQL事務控制流與ACID特性

標簽:臺州 濟寧 廣東 安徽 泰安 武威 汕頭 濟源

巨人網絡通訊聲明:本文標題《MySQL令人大跌眼鏡的隱式轉換》,本文關鍵詞  MySQL,令人,大跌眼鏡,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL令人大跌眼鏡的隱式轉換》相關的同類信息!
  • 本頁收集關于MySQL令人大跌眼鏡的隱式轉換的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    精品国产精品网麻豆系列| 欧美一区二区不卡视频| 色又黄又爽网站www久久| 日韩一区二区在线免费观看| 中文字幕日韩一区| 三级欧美在线一区| 色天天综合久久久久综合片| 国产偷国产偷精品高清尤物| 国产伦精品一区二区三区视频青涩| 在线观看国产91| 亚洲高清久久久| 欧美顶级少妇做爰| 午夜私人影院久久久久| 欧美性生活久久| 麻豆成人在线观看| 国产欧美日韩在线看| 99久久精品免费| 亚洲制服丝袜av| 欧美成人在线直播| 成人av先锋影音| 日韩码欧中文字| 欧美大黄免费观看| 欧美性猛片aaaaaaa做受| 天天色天天操综合| 国产日韩欧美在线一区| 在线电影国产精品| 色综合久久88色综合天天免费| 日韩国产在线观看| 亚欧色一区w666天堂| 欧美tk丨vk视频| 欧美性大战久久| 成人福利电影精品一区二区在线观看| 亚洲欧美另类图片小说| 精品国产亚洲一区二区三区在线观看 | 色域天天综合网| 激情久久五月天| 亚洲精品成人天堂一二三| 欧美mv日韩mv国产网站| 欧美日韩中字一区| 欧美色视频一区| 欧美日韩一级视频| 91在线porny国产在线看| 国产成人高清在线| 国产精品99久久久久久似苏梦涵 | 欧美久久久影院| 欧美一区二区三区在线| 欧美日韩国产精品成人| 欧美日韩一区二区三区在线 | aaa欧美大片| av不卡免费在线观看| 东方欧美亚洲色图在线| 99精品视频一区| 欧美综合视频在线观看| 678五月天丁香亚洲综合网| 日韩丝袜情趣美女图片| 日韩精品一区二区三区蜜臀| 欧美激情综合在线| 一区二区三区在线观看动漫| 亚洲一区二区三区四区在线| 狠狠色丁香久久婷婷综合丁香| 国产一区二区视频在线| 91麻豆国产在线观看| 在线成人av影院| 国产人成亚洲第一网站在线播放| 国产精品亲子乱子伦xxxx裸| 天堂一区二区在线| 国产一区二区三区免费在线观看| 91麻豆精品一区二区三区| www国产亚洲精品久久麻豆| 一区二区三区欧美久久| 国产成人av一区二区| 日韩三级.com| 蜜乳av一区二区三区| 精品视频色一区| 日韩高清不卡一区二区| 精品一区二区三区不卡| 欧美日韩精品欧美日韩精品一| 欧美一区二区福利视频| 亚洲六月丁香色婷婷综合久久| 夜夜精品视频一区二区| 成人免费观看av| 欧美精品一区二区在线播放| 亚洲欧美日韩在线播放| 国内久久婷婷综合| 日韩一区二区三区av| 亚洲成av人片| 欧美精品视频www在线观看 | 国产综合久久久久久鬼色| 日韩欧美在线不卡| 久久成人久久爱| 欧美成人r级一区二区三区| 亚洲午夜精品网| 欧美日韩美少妇| 亚洲欧洲制服丝袜| 91丝袜美腿高跟国产极品老师| 久久久.com| 99免费精品在线观看| 日韩一区二区免费在线电影| 91精品免费观看| 欧美麻豆精品久久久久久| 欧美大片一区二区三区| 青青国产91久久久久久| 88在线观看91蜜桃国自产| 五月激情六月综合| 337p粉嫩大胆色噜噜噜噜亚洲 | 国产一区二区三区国产| 国产精品全国免费观看高清| 美腿丝袜亚洲三区| 久久精品国产精品青草| 久久精品国产亚洲5555| 欧美日韩综合在线免费观看| 老司机午夜精品99久久| 国产欧美视频在线观看| 免费一级片91| 亚洲色图视频网| gogogo免费视频观看亚洲一| 日韩av一区二区三区四区| 中文成人综合网| 亚洲精品一区二区三区蜜桃下载 | 91香蕉视频污| 91国偷自产一区二区开放时间| 免费成人在线观看| 亚洲一区二区不卡免费| 久久五月婷婷丁香社区| 欧美日韩一级视频| 欧美亚洲一区三区| 蜜臀av一区二区在线观看| 亚洲电影你懂得| 国产日本欧洲亚洲| 日韩欧美一级特黄在线播放| 91蜜桃婷婷狠狠久久综合9色| 韩国精品主播一区二区在线观看 | 久久夜色精品国产噜噜av| 成人黄色软件下载| 激情综合五月天| 免费精品99久久国产综合精品| 美日韩一区二区| 99综合电影在线视频| 在线观看日韩精品| 7777精品久久久大香线蕉| 精品久久国产97色综合| 免费在线观看成人| 国产69精品一区二区亚洲孕妇| 青青草精品视频| 国产一区免费电影| 91在线视频官网| 欧美日韩二区三区| 久久色.com| 亚洲一区二区三区自拍| 久久电影网电视剧免费观看| 激情综合网av| 成人丝袜视频网| 色国产精品一区在线观看| 久久久国产精品麻豆| 偷窥少妇高潮呻吟av久久免费| 久久国产剧场电影| 国产一区二区三区av电影| 在线观看亚洲专区| www国产精品av| 精一区二区三区| 色综合久久99| 最新日韩av在线| 国产真实精品久久二三区| 欧美一区二区播放| 免费高清在线一区| 欧美一区日本一区韩国一区| 午夜激情久久久| 欧美性感一类影片在线播放| 一区二区三区四区不卡视频| 欧美吻胸吃奶大尺度电影| 国产精品高潮呻吟久久| 成人一区二区三区| 中文字幕一区在线| 色视频一区二区| 青青草97国产精品免费观看 | 日本亚洲最大的色成网站www| 91精品国产欧美日韩| 日韩精品电影在线| 国产欧美中文在线| 色综合天天综合色综合av| 日韩中文字幕1| 日韩视频在线你懂得| 国产91综合一区在线观看| 亚洲制服丝袜av| 国产欧美一区二区精品性| 欧美伊人久久久久久久久影院 | 国产福利一区在线| 中文字幕制服丝袜一区二区三区| 成人精品一区二区三区四区| 亚洲国产一区二区三区青草影视| 日韩欧美一区二区视频| 色哟哟一区二区在线观看| 国产中文字幕一区| 日产国产高清一区二区三区 | 久久久亚洲精华液精华液精华液 | 日韩精品一二三| 亚洲伊人伊色伊影伊综合网| 久久综合成人精品亚洲另类欧美| 欧美日韩三级一区二区| 99热这里都是精品|