婷婷综合国产,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
    成人av午夜电影| 免费美女久久99| 国产成人精品免费看| 中文字幕乱码亚洲精品一区| 成人黄色a**站在线观看| 同产精品九九九| 久久久精品日韩欧美| 国产成人激情av| 五月综合激情婷婷六月色窝| 亚洲精品在线观| 日韩三级视频中文字幕| 色视频一区二区| 国产成a人亚洲精品| 免费成人在线视频观看| 亚洲精品一二三| 国产精品视频一区二区三区不卡| 欧美亚洲禁片免费| 成人av资源站| proumb性欧美在线观看| 精品亚洲porn| 欧美激情艳妇裸体舞| 日韩精品一区二区三区视频在线观看| 一本到不卡免费一区二区| 99九九99九九九视频精品| 国产一区二区在线视频| 亚洲妇熟xx妇色黄| 一区二区三区在线免费视频 | 日韩精品一区二区三区中文精品| 色综合天天在线| 91在线丨porny丨国产| 国产成人免费在线| av男人天堂一区| 91免费观看视频在线| 麻豆久久一区二区| 国产成人亚洲综合色影视| 国产a久久麻豆| 欧美影视一区二区三区| 日韩一级片网址| 依依成人综合视频| 国产精品久久久久aaaa樱花| 成人免费在线视频| 亚洲成a人片综合在线| 另类调教123区| 成人av网站在线观看免费| 91小视频在线| 亚洲欧美视频一区| 成人欧美一区二区三区小说 | 91成人免费在线视频| 久久―日本道色综合久久| 日本韩国欧美一区二区三区| 国产精品第13页| 色哟哟国产精品免费观看| 自拍av一区二区三区| 91麻豆视频网站| 亚洲综合网站在线观看| 欧美日韩午夜精品| 九一久久久久久| 中文字幕亚洲综合久久菠萝蜜| 99久久精品免费看国产免费软件| 亚洲视频一区二区在线观看| 欧美无人高清视频在线观看| 亚洲v中文字幕| 日韩你懂的在线观看| 爽爽淫人综合网网站| 亚洲国产精品高清| 日韩精品电影在线| 亚洲国产精品成人综合| av在线不卡网| 日韩电影在线观看电影| 国产欧美视频在线观看| 色香色香欲天天天影视综合网| 亚洲v日本v欧美v久久精品| 久久综合九色欧美综合狠狠| 色悠悠亚洲一区二区| 日韩国产欧美视频| 在线播放视频一区| 狠狠色综合日日| 亚洲女同一区二区| 欧美电影影音先锋| 激情小说亚洲一区| 国产欧美日韩在线视频| av成人老司机| 亚洲成人一区在线| 久久这里只有精品视频网| 国产精品一区久久久久| 日韩一区二区在线看片| 极品少妇一区二区三区精品视频| 26uuu亚洲综合色| 91免费版pro下载短视频| 激情久久五月天| 懂色av一区二区三区免费看| 五月天亚洲婷婷| 欧美一区二区人人喊爽| 极品瑜伽女神91| 日本强好片久久久久久aaa| 亚洲日本乱码在线观看| 亚洲综合无码一区二区| 久久久久久久久免费| 风间由美性色一区二区三区| 日韩av网站免费在线| 国产精品色眯眯| 91色九色蝌蚪| 蜜臀av性久久久久蜜臀aⅴ | 国产在线播放一区| 三级亚洲高清视频| 国产精品国产a| 欧美国产日韩精品免费观看| 26uuu成人网一区二区三区| 国产高清精品网站| 亚洲自拍偷拍欧美| 亚洲国产一区二区在线播放| 石原莉奈在线亚洲三区| 成人午夜精品一区二区三区| 蜜臀精品久久久久久蜜臀| 成人99免费视频| 欧美一级高清大全免费观看| 久久综合久久综合久久综合| 欧美色图激情小说| 国产一区二区三区| 99v久久综合狠狠综合久久| 一区二区三区在线看| 国产精品色在线| 国产精品欧美久久久久无广告 | 欧美成人精品3d动漫h| 91免费版在线看| 欧美丰满美乳xxx高潮www| 欧美日韩国产中文| 久久精品免视看| 色综合中文字幕国产 | 国产性天天综合网| 日韩精品中文字幕一区| 一区二区三区欧美日韩| 91电影在线观看| 亚洲精品国产品国语在线app| 国产中文字幕一区| 欧美视频一区二区三区在线观看 | 欧美日韩久久一区| 久久久久久久综合日本| 一区二区在线观看视频在线观看| 91精品国产入口| 91女人视频在线观看| 日韩精品电影在线| 亚洲激情一二三区| 天堂va蜜桃一区二区三区漫画版| 成人久久久精品乱码一区二区三区 | 欧美自拍偷拍午夜视频| 国产精品影视在线观看| 午夜精品成人在线视频| 亚洲第一主播视频| 久久久亚洲欧洲日产国码αv| 久久这里只精品最新地址| 欧美一区二区日韩| 日韩精品一区二区三区视频| 精品国产亚洲在线| 一区二区三区视频在线看| 国产日韩综合av| 亚洲色图19p| 日韩欧美久久一区| 中文字幕不卡在线观看| 最新国产の精品合集bt伙计| 五月婷婷综合在线| 午夜视频一区二区| 一本大道av伊人久久综合| 91黄色免费看| 欧美激情中文不卡| 日韩精品最新网址| 欧美在线影院一区二区| 91国产成人在线| 91精品视频网| 国产精品拍天天在线| 99麻豆久久久国产精品免费优播| 国产精品久久久久久久第一福利| 日本亚洲三级在线| 国产成人免费高清| 99九九99九九九视频精品| 精品国产91亚洲一区二区三区婷婷| 日韩午夜在线观看视频| 一区二区三区在线看| 国产成人av一区二区三区在线| 91理论电影在线观看| 精品国产1区二区| 亚洲免费在线观看| 99久久777色| 日韩欧美精品在线| 亚洲bdsm女犯bdsm网站| 国产成人在线影院| 久久视频一区二区| 日本一不卡视频| 欧美一区二区三区四区在线观看 | 欧美成人一区二区三区在线观看| 亚洲乱码日产精品bd| 精品一区二区三区在线观看国产 | 99久久精品国产一区二区三区| 91网上在线视频| 一个色综合网站| 成人av在线资源| 99久久精品国产毛片| 丝袜美腿亚洲综合| 欧美丰满美乳xxx高潮www| 久久精品国内一区二区三区|