国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

thinkORM在使用別名時會將條件全部轉成字符串

wybwsk

問題描述

當使用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

加了別名條件就會從整數變成字符,但是聯表肯定需要用別名,變成字符可能會導致索引失效。

499 4 0
4個回答

nitron

sql語句不會強行cast, 將他轉成字符串的在獲取結果集之后
你看下執(zhí)行的SQL語句,不要看php的結果

  • wybwsk 2025-06-11

    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

    打開通用日志,看到的是這樣,是真實轉成字符了。

  • nitron 2025-06-11

    你用在mysql里用explain一下這個sql語句就明白了

  • nitron 2025-06-11

    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類型時的差異

  • wybwsk 2025-06-11

    就是這個隱式轉換,一般情況下是正常的,只是我在查慢SQL時,復雜的SQL聯表查詢,他走的索引不對,然后我就試著將這些條件是int的,全部改成了int,然后索引對了。查詢時間從3秒多降到了0.幾秒。所以我才想著要怎么改這個?,F在我的解決辦法是拆SQL,也降下來了。

    然后我試了laravel的數據庫操作組件,他就是正常的,你傳數字就是數字,傳字符就是字符。舊項目是沒辦法了,新項目大概率是會換成laravel的組件。

  • nitron 2025-06-11

    多連表查詢并且多個聚合索引, 我一般都會手動指定/強制指定索引

lsmir2

直接寫視圖.

  • 暫無評論
muyu

實際上在使用主鍵檢索的時候,mysql會自己轉換參數,默認走的還是主鍵索引,至于其他字段就不好說了~

  • wybwsk 2025-06-11

    簡單的查詢是沒問題的,字符和數字沒區(qū)別,復雜點的就出問題了,一個表有多個復合索引,然后就容易出問題。
    因為我也不是所有的都這樣,遇到問題SQL拿出來explain一下,才發(fā)現不對,然后當時試著將其他復雜一些的SQL explain一下,又是正常的。所以我也慒。

  • 三冬四夏 2025-06-11

    不好解決就加強制索引

jack10082009

其實我印象中是直接執(zhí)行SQL語句會導致全字符串類型;但是使用預編譯的語句就會是本來的類型

  • 暫無評論
??