1 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
我知道沒有 RDBMS 能夠綁定未知數(shù)量的參數(shù)。永遠(yuǎn)不可能匹配具有未知數(shù)量的參數(shù)占位符的數(shù)組。這意味著沒有將數(shù)組綁定到查詢的智能方法,例如:
SELECT xxx FROM xxx WHERE xxx in (?,...,?)
這不是客戶端驅(qū)動(dòng)程序的限制,數(shù)據(jù)庫服務(wù)器根本不支持這一點(diǎn)。
有各種解決方法。
您可以使用 20 ? 創(chuàng)建查詢,綁定您擁有的值,并通過 NULL 值完成綁定。它工作正常,因?yàn)樯婕?NULL 值的比較操作的特定語義。像“field = ?”這樣的條件 當(dāng)參數(shù)綁定到 NULL 值時(shí),計(jì)算結(jié)果始終為 false,即使某些行匹配。假設(shè)您的數(shù)組中有 5 個(gè)值,數(shù)據(jù)庫服務(wù)器將必須處理 5 個(gè)提供的值,以及 15 個(gè) NULL 值。忽略 NULL 值通常足夠聰明
另一種解決方案是準(zhǔn)備所有查詢(每個(gè)查詢具有不同數(shù)量的參數(shù))。只有在參數(shù)的最大數(shù)量受到限制時(shí)才有趣。它適用于準(zhǔn)備好的語句真正重要的數(shù)據(jù)庫(例如 Oracle)。
就 MySQL 而言,使用準(zhǔn)備好的語句的收益非常有限。請(qǐng)記住,準(zhǔn)備好的語句僅在每個(gè)會(huì)話中維護(hù),它們不會(huì)跨會(huì)話共享。如果你有很多會(huì)話,它們會(huì)占用內(nèi)存。另一方面,使用 MySQL 解析語句不會(huì)涉及太多開銷(與其他一些數(shù)據(jù)庫系統(tǒng)相反)。通常,生成大量準(zhǔn)備好的語句來覆蓋單個(gè)查詢是不值得的。
請(qǐng)注意,一些 MySQL 驅(qū)動(dòng)程序提供了準(zhǔn)備好的語句接口,而它們?cè)趦?nèi)部不使用 MySQL 協(xié)議的準(zhǔn)備好的語句功能(同樣,因?yàn)橥ǔ2恢档茫?/p>
還有一些其他解決方案(例如依賴臨時(shí)表),但只有在參數(shù)數(shù)量很大時(shí)它們才有意義。
- 1 回答
- 0 關(guān)注
- 280 瀏覽
添加回答
舉報(bào)