亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識(shí)庫 > MySQL令人大跌眼鏡的隱式轉(zhuǎn)換

MySQL令人大跌眼鏡的隱式轉(zhuǎn)換

熱門標(biāo)簽:南京電銷外呼系統(tǒng)哪家好 外呼系統(tǒng)會(huì)封嗎 股票配資電銷機(jī)器人 電銷機(jī)器人 深圳 地圖標(biāo)注如何弄全套標(biāo) 在電子版地圖標(biāo)注要收費(fèi)嗎 實(shí)體店地圖標(biāo)注怎么標(biāo) 萬利達(dá)綜合醫(yī)院地圖標(biāo)注點(diǎn) 武漢AI電銷機(jī)器人

MySQL的隱式轉(zhuǎn)換

一、問題描述

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)

奇怪的現(xiàn)象:

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


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

二、源碼解釋

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

其中JOIN::exec()是執(zhí)行的入口,Arg_comparator::compare_real()是進(jìn)行等值判斷的函數(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。

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

如何檢測(cè)string類型的數(shù)字轉(zhuǎn)成doule類型是否溢出呢?這里經(jīng)過測(cè)試,當(dāng)數(shù)字超過16位以后,轉(zhuǎn)成double類型就已經(jīng)不準(zhǔn)確了,例如20402702611292711會(huì)表示成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(太復(fù)雜了,簡(jiǎn)單貼個(gè)注釋吧)

/*
  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).
*/


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

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)

結(jié)果符合預(yù)期,而在本例中,正確的寫法應(yīng)當(dāng)是

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

三、結(jié)論

避免發(fā)生隱式類型轉(zhuǎn)換,隱式轉(zhuǎn)換的類型主要有字段類型不一致、in參數(shù)包含多個(gè)類型、字符集類型或校對(duì)規(guī)則不一致等
隱式類型轉(zhuǎn)換可能導(dǎo)致無法使用索引、查詢結(jié)果不準(zhǔn)確等,因此在使用時(shí)必須仔細(xì)甄別
數(shù)字類型的建議在字段定義時(shí)就定義為int或者bigint,表關(guān)聯(lián)時(shí)關(guān)聯(lián)字段必須保持類型、字符集、校對(duì)規(guī)則都一致

最后貼一下官網(wǎng)對(duì)于隱式類型轉(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)換的詳細(xì)內(nèi)容,更多關(guān)于MySQL的隱式轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!,希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • MySQL如何實(shí)現(xiàn)事務(wù)的ACID
  • Mysql中事務(wù)ACID的實(shí)現(xiàn)原理詳解
  • MySQL非空約束(not null)案例講解
  • 解決mysql數(shù)據(jù)庫數(shù)據(jù)遷移達(dá)夢(mèng)數(shù)據(jù)亂碼問題
  • MySQL連接異常報(bào)10061錯(cuò)誤問題解決
  • MySQL事務(wù)控制流與ACID特性

標(biāo)簽:臺(tái)州 濟(jì)寧 廣東 安徽 泰安 武威 汕頭 濟(jì)源

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL令人大跌眼鏡的隱式轉(zhuǎn)換》,本文關(guān)鍵詞  MySQL,令人,大跌眼鏡,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL令人大跌眼鏡的隱式轉(zhuǎn)換》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL令人大跌眼鏡的隱式轉(zhuǎn)換的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产一区二区福利久久| 成人免费高清视频| 日韩欧美一二三区| 91麻豆国产| 青青久热| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 久久国产精品只做精品| 亚洲精品影院| 亚洲 欧美 91| 国产伦久视频免费观看 视频 | 亚洲天堂免费观看| 亚洲精品影院| 99久久网站| 精品久久久久久综合网| 久久国产一区二区| 欧美激情中文字幕一区二区| 999精品在线| 青青久久精品| 黄视频网站免费观看| 美女免费精品视频在线观看| 你懂的在线观看视频| 沈樵在线观看福利| 超级乱淫黄漫画免费| 亚洲 国产精品 日韩| 亚飞与亚基在线观看| 国产成人精品综合久久久| 成人a大片在线观看| 99色视频在线| 久久久成人影院| 成人免费观看网欧美片| 久久精品大片| 国产成人啪精品视频免费软件| 欧美激情一区二区三区在线| 日韩专区一区| 成人影院一区二区三区| 美女免费精品视频在线观看| 一级毛片视频在线观看| 久久国产精品永久免费网站| 国产一区二区精品在线观看| 91麻豆精品国产片在线观看| 青青青草影院 | 日本在线www| 欧美激情伊人| 久草免费在线视频| 天堂网中文字幕| 亚欧成人毛片一区二区三区四区| 国产亚洲精品aaa大片| 国产综合成人观看在线| 天天做人人爱夜夜爽2020| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 精品国产一区二区三区久 | 欧美a免费| 日本特黄一级| 国产成人精品综合久久久| 亚洲精品影院| 午夜久久网| 毛片成人永久免费视频| 精品视频在线观看一区二区| 色综合久久天天综合| 91麻豆精品国产自产在线| 久久国产一区二区| 美女被草网站| 国产成人欧美一区二区三区的| 麻豆网站在线看| 国产成人啪精品| 国产成人精品综合久久久| 精品在线视频播放| 亚洲第一页乱| 欧美激情伊人| 国产伦久视频免费观看视频| 欧美激情一区二区三区视频高清| 精品国产一区二区三区久| 免费国产一级特黄aa大片在线| 高清一级毛片一本到免费观看| 国产极品精频在线观看| 日韩专区亚洲综合久久| 日韩欧美一二三区| 国产伦久视频免费观看视频| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 麻豆网站在线看| 黄视频网站免费| 国产不卡精品一区二区三区| 国产精品自拍在线观看| 精品久久久久久中文字幕一区| 999久久66久6只有精品| 日韩在线观看视频免费| 台湾毛片| 成人免费观看网欧美片| 日日夜夜婷婷| 欧美激情一区二区三区在线| 久久精品大片| 欧美爱色| 国产网站免费视频| 国产麻豆精品hdvideoss| 精品在线观看国产| 国产美女在线观看| 国产成人欧美一区二区三区的| 久久久久久久久综合影视网| 四虎精品在线观看| 国产亚洲免费观看| 欧美激情中文字幕一区二区| 国产精品123| 日韩欧美一及在线播放| 色综合久久天天综线观看| 久久国产精品自线拍免费| 免费的黄视频| 国产91素人搭讪系列天堂| 香蕉视频三级| 精品国产一区二区三区久| 欧美激情一区二区三区在线| 日韩男人天堂| 一级片片| 国产成人啪精品| 成人免费观看的视频黄页| 精品国产香蕉伊思人在线又爽又黄| 国产精品自拍在线| 精品久久久久久中文| 黄视频网站免费观看| 欧美另类videosbestsex| 精品视频一区二区三区免费| 午夜久久网| 国产成人精品在线| 久久精品大片| 韩国妈妈的朋友在线播放| 欧美激情一区二区三区在线 | 九九久久99综合一区二区| 国产精品1024永久免费视频| 四虎影视久久| 免费一级片网站| 99热精品一区| 欧美a级大片| 你懂的福利视频| 精品国产一区二区三区精东影业| 精品视频免费在线| 九九热国产视频| 精品在线观看国产| 97视频免费在线| 精品久久久久久综合网| 人人干人人草| 91麻豆国产福利精品| 久久国产一久久高清| 国产高清在线精品一区a| 精品国产三级a∨在线观看| 国产视频一区二区三区四区| 日韩av成人| 可以免费看污视频的网站| 毛片成人永久免费视频| 四虎影视库国产精品一区| 国产成人精品影视| 亚洲天堂一区二区三区四区| 国产视频在线免费观看| 精品视频在线观看免费| 国产视频一区二区在线播放| 午夜久久网| a级精品九九九大片免费看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 99久久精品国产片| 成人在激情在线视频| 精品国产一区二区三区久| a级精品九九九大片免费看| 久久久久久久网| 一本伊大人香蕉高清在线观看| 免费毛片基地| 国产一区二区高清视频| 天天做日日爱| 可以免费看毛片的网站| 成人在激情在线视频| 日韩一级黄色片| 久久久成人网| 九九久久国产精品大片| 欧美a免费| 免费国产在线视频| 美女免费精品高清毛片在线视| 欧美激情在线精品video| 黄视频网站在线免费观看| 亚洲第一色在线| 欧美18性精品| 一级毛片视频在线观看| 久久99中文字幕| 黄视频网站免费观看| 成人影院一区二区三区| 精品久久久久久中文字幕一区 | 青青久热| 成人影视在线播放| 91麻豆精品国产自产在线观看一区| 四虎影视库| 国产一区精品| 999久久66久6只有精品| 亚洲天堂一区二区三区四区| 日本伦理片网站| 欧美激情一区二区三区在线 | 九九久久99综合一区二区| 国产激情一区二区三区| 日本在线www| 成人a大片高清在线观看| 一级女性全黄生活片免费| 国产视频网站在线观看| 国产精品免费久久| 日韩中文字幕一区二区不卡| 香蕉视频三级|