當使用thinkORM DB工作時,單表沒問題,只要有別名就會將條件變成字符
workerman/webman-framework:2.1.2
webman/think-orm:2.1.6
$res = Db::table('user')->where('uid',1)->fetchSql()->find();
print_r($res);
SELECT * FROM user
WHERE uid
= 1 LIMIT 1
$res = Db::table('user')->alias('a')->where('a.uid', 1)->fetchSql()->find();
print_r($res);
SELECT * FROM user
a
WHERE a
.uid
= '1' LIMIT 1
加了別名條件就會從整數變成字符,但是聯表肯定需要用別名,變成字符可能會導致索引失效。
sql語句不會強行cast, 將他轉成字符串的在獲取結果集之后
你看下執(zhí)行的SQL語句,不要看php的結果
12 Prepare SHOW FULL COLUMNS FROM user
12 Execute SHOW FULL COLUMNS FROM user
12 Prepare SELECT FROM user
WHERE uid
= ? LIMIT 1
12 Close stmt
12 Prepare SELECT FROM user
WHERE uid
= ? LIMIT 1
12 Execute SELECT FROM user
WHERE uid
= 1 LIMIT 1
12 Prepare SELECT FROM user
a
WHERE a
.uid
= ? LIMIT 1
12 Close stmt
12 Execute SELECT * FROM user
a
WHERE a
.uid
= '1' LIMIT 1
打開通用日志,看到的是這樣,是真實轉成字符了。
int類型字段的查詢條件會隱式轉換成數字,所以值是否時字符串無影響,如果該字段有索引,會走索引,所以以下是等價的
SELECT * FROM user WHERE uid = 1
SELECT * FROM user a WHERE a.uid = '1'
SELECT * FROM user a WHERE a.uid = 1
char類型則不一樣,以下不是等價的
SELECT * FROM user WHERE name = '1'
SELECT * FROM user WHERE name = 1;
結論是,轉成字符串,更多是為了處理char類型時的差異
就是這個隱式轉換,一般情況下是正常的,只是我在查慢SQL時,復雜的SQL聯表查詢,他走的索引不對,然后我就試著將這些條件是int的,全部改成了int,然后索引對了。查詢時間從3秒多降到了0.幾秒。所以我才想著要怎么改這個?,F在我的解決辦法是拆SQL,也降下來了。
然后我試了laravel的數據庫操作組件,他就是正常的,你傳數字就是數字,傳字符就是字符。舊項目是沒辦法了,新項目大概率是會換成laravel的組件。