成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL數(shù)據(jù)庫中不同數(shù)據(jù)類型字段關(guān)聯(lián)后結(jié)果居然有這么大差異?

數(shù)據(jù)庫 MySQL
在數(shù)據(jù)庫的世界里,數(shù)據(jù)的連接操作是至關(guān)重要的。但在處理關(guān)聯(lián)表的字段的數(shù)據(jù)類型不同時,得到的結(jié)果經(jīng)常會出乎預(yù)料。

一、案例

1、數(shù)據(jù)庫中先創(chuàng)建表及數(shù)據(jù)

-- 創(chuàng)建tb1
CREATE TABLE tb1 (
  id BIGINT NOT NULL PRIMARY KEY, NAME VARCHAR (20)
);
INSERT INTO tb1 (id, NAME)
VALUES
  (1459066134882947196, 'na1'), (1459066134882947172, 'cccb'), (1459066134882947163, 'tttttttn'), (1459066134882947198, 'acqada');
 
--  創(chuàng)建tb2
CREATE TABLE tb2 (
  id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, pid VARCHAR (20), c1 VARCHAR (10)
);
INSERT INTO tb2 (pid, c1)
VALUES
  ('1459066134882947196', 'cs'), (1459066134882947197, 'tt');

tb1 的id表為bigint,tb2表pid字段類型為varchar。

2、進行左連接查詢

SELECT  a.id,b.pid 
FROM  tb1 a  LEFT JOIN tb2 b 
ON a.id=b.`pid`
WHERE a.id =1459066134882947196

查詢結(jié)果如下

圖片

結(jié)果為非預(yù)期,因為2個表的關(guān)聯(lián)字段的內(nèi)容并不相同。

3、使用內(nèi)連接

SELECT  a.id,b.pid 
FROM  tb1 a   JOIN tb2 b 
ON a.id=b.`pid`
WHERE a.id =1459066134882947196

使用內(nèi)連接后,結(jié)果也不正確。

圖片

4、不加where條件的左連接

SELECT  a.id,b.pid 
FROM  tb1 a   LEFT JOIN tb2 b 
ON a.id=b.`pid`

查詢結(jié)果如下:

圖片

關(guān)聯(lián)后確實是非預(yù)期的結(jié)果。

5、不加where條件的內(nèi)連接

SELECT  a.id,b.pid 
FROM  tb1 a    JOIN tb2 b 
ON a.id=b.`pid`

查詢結(jié)果為:

此時不加where條件的內(nèi)連接的結(jié)果卻是正確的、

二、解決方案

解決此問題的方法主要是解決兩個關(guān)聯(lián)字段的類型不同的問題,可以有2種方式

1、顯式類型轉(zhuǎn)換

在關(guān)聯(lián)的時候顯式地進行字段類型轉(zhuǎn)換,例如:

SELECT  a.id,b.pid FROM  tb1 a LEFT JOIN tb2 b 
ON CAST(a.`id`  AS  CHAR)=b.`pid`
WHERE a.id=1459066134882947196

結(jié)果如下

此時結(jié)果正確。
內(nèi)連接結(jié)果也正確。

SELECT  a.id,b.pid 
FROM  tb1 a    JOIN tb2 b 
ON CAST(a.`id`  AS  CHAR)=b.`pid`
WHERE a.id =1459066134882947196

2、改變字段類型(推薦)

如果兩張表的數(shù)據(jù)量較大,使用顯式的字段類型轉(zhuǎn)換(包括當前隱式字段類型轉(zhuǎn)換)都將導致關(guān)聯(lián)時不能使用索引,影響性能。因此建議在表設(shè)計時就將存在關(guān)聯(lián)關(guān)系的字段類型設(shè)置為類型相同(字符類型時字符集及排序規(guī)則也一致)例如:

ALTER TABLE  tb2 MODIFY pid BIGINT;

修改后再查詢看一下結(jié)果:

SELECT  a.id,b.pid 
FROM  tb1 a   LEFT JOIN tb2 b 
ON a.`id`=b.`pid`
WHERE a.id =1459066134882947196

結(jié)果正確:

圖片

三、小結(jié)

此情況的出現(xiàn)是因為兩表的關(guān)聯(lián)字段類型不同時進行字段類型轉(zhuǎn)換導致。bigint與varchar轉(zhuǎn)換過程中字段精度出現(xiàn)問題,實際超過int最大值的數(shù)據(jù)(2147483647,即2^31 - 1)的數(shù)據(jù)被截斷為2^31 - 1處理,因為兩表進行左關(guān)聯(lián)時,存在異常。

從上面的過程中,也發(fā)現(xiàn)左連接過程與內(nèi)連接的過程中的中間數(shù)據(jù)結(jié)果(1.4及1.5中)也不同。

責任編輯:姜華 來源: 數(shù)據(jù)庫干貨鋪
相關(guān)推薦

2010-06-04 09:16:40

MySQL 命令

2024-03-18 09:24:12

RocketMQ消息模型分布式

2010-06-02 11:24:57

MySQL數(shù)據(jù)庫主鍵

2022-07-03 06:10:15

MySQL數(shù)據(jù)庫

2010-05-26 17:05:48

MySQL數(shù)據(jù)類型

2013-01-24 09:44:44

數(shù)據(jù)庫

2017-05-25 10:23:13

數(shù)據(jù)a表b表

2021-08-03 22:26:46

Go函數(shù)分頁

2010-09-01 15:23:59

DB2字段類型

2023-05-25 10:03:40

2012-03-16 15:20:43

MySQL

2011-03-16 15:07:10

DB2數(shù)據(jù)庫數(shù)據(jù)類型

2011-03-30 14:08:27

MySQL數(shù)據(jù)庫刪除恢復

2010-06-30 11:31:55

SQL Server數(shù)

2010-08-26 09:44:42

db2數(shù)據(jù)類型

2011-08-25 16:31:36

SQL Servertimestamp

2017-07-10 13:38:07

MySQL數(shù)據(jù)類型整數(shù)類型

2025-04-08 06:00:00

2011-08-04 15:55:25

SQL Server數(shù)

2010-10-15 13:28:34

MySql數(shù)據(jù)類型
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲免费一区二区 | 欧美日韩综合一区 | 国产精品久久久久久久久久妞妞 | 蜜臀久久99精品久久久久久宅男 | 九九九视频 | 精品欧美一区二区精品久久久 | 99免费在线视频 | 欧美成人高清视频 | 四虎影院在线观看免费视频 | 欧美中文字幕一区二区三区亚洲 | 久久蜜桃av一区二区天堂 | 午夜合集| 亚洲日韩中文字幕一区 | 一区二区三区精品在线视频 | 一区二区激情 | 99久久久久久99国产精品免 | 国产精品a免费一区久久电影 | 欧美一区免费在线观看 | 91av国产在线视频 | 黑人巨大精品 | 欧美一级淫片免费视频黄 | 在线播放一区二区三区 | 精品视频久久久久久 | 中国xxxx性xxxx产国 | 最新毛片网站 | 亚洲精品电影网在线观看 | 久久久久亚洲国产| av香港经典三级级 在线 | 人人爽人人爽 | 国产高清视频在线观看 | www成人免费视频 | 91影院在线观看 | 成在线人视频免费视频 | 国产精品久久av | 久久小视频 | 亚洲天堂网站 | 国产亚洲欧美日韩精品一区二区三区 | 中文字幕亚洲一区二区三区 | 午夜一级大片 | 亚洲九九精品 | 国产成人久久精品一区二区三区 |