自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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、進(jìn)行左連接查詢

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

查詢結(jié)果如下

圖片

結(jié)果為非預(yù)期,因?yàn)?個表的關(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)后確實(shí)是非預(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)的時候顯式地進(jì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)換(包括當(dāng)前隱式字段類型轉(zhuǎn)換)都將導(dǎo)致關(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)是因?yàn)閮杀淼年P(guān)聯(lián)字段類型不同時進(jìn)行字段類型轉(zhuǎn)換導(dǎo)致。bigint與varchar轉(zhuǎn)換過程中字段精度出現(xiàn)問題,實(shí)際超過int最大值的數(shù)據(jù)(2147483647,即2^31 - 1)的數(shù)據(jù)被截斷為2^31 - 1處理,因?yàn)閮杀磉M(jìn)行左關(guān)聯(lián)時,存在異常。

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

責(zé)任編輯:姜華 來源: 數(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ù)庫

2021-08-03 22:26:46

Go函數(shù)分頁

2017-05-25 10:23:13

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

2010-09-01 15:23:59

DB2字段類型

2023-05-25 10:03:40

2012-03-16 15:20:43

MySQL

2011-03-30 14:08:27

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

2011-03-16 15:07:10

DB2數(shù)據(jù)庫數(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

2010-10-15 13:28:34

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

2011-08-04 15:55:25

SQL Server數(shù)
點(diǎn)贊
收藏

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