首頁  >  文章  >  資料庫  >  為什麼將 0 插入 MySQL BIT(1) 欄位會得到 1?

為什麼將 0 插入 MySQL BIT(1) 欄位會得到 1?

Patricia Arquette
Patricia Arquette原創
2024-11-03 05:42:02843瀏覽

Why Does Inserting 0 into a MySQL BIT(1) Field Result in 1?

將0 插入MySQL BIT(1) 欄位結果為1:問題與解決方案

嘗試將0 值插入到使用PDO 準備語句的MySQL 中的BIT(1) 欄位意外地導致值1 寫入表中。儘管使用各種形式的參數綁定甚至原始 SQL,但僅在插入值 0 時才會出現此行為。

為什麼佔位符因 0 插入而失敗

BIT 列MySQL 中是二進位類型,這可能會導致與 PDO 等客戶端程式庫的相容性問題。出現此問題的原因如下:

  • BIT 欄位是位元組對齊的,無論指定的大小如何,每行都會消耗一個完整位元組。
  • PDO 錯誤地解釋了 0由於位元組對齊問題,值為 1 位元。

解:使用 TINYINT(1) 取代

要解決此問題,建議修改欄位類型從 BIT(1) 到 TINYINT(1)。這將確保為每一行分配一個字節,無論插入的值如何。 TINYINT(1) 也可以用於儲存布林值,消除了與 BIT 列的兼容性問題。

例如,以下程式碼應該可以正常運作:

$pdo = new PDO("connection string etc") ;
$statement = $pdo->prepare('INSERT INTO `test` (SomeText,TestBool) VALUES (?,?)') ;
$statement->execute(array("TEST",0)) ;

如果您仍然想要使用BIT(1),您可以嘗試以下解決方法:

$statement = $pdo->prepare('INSERT INTO `test` (SomeText,TestBool) VALUES (:someText,:testBool)') ;
$statement->bindValue(':someText', "TEST");
$statement->bindValue(':testBool', 0, PDO::PARAM_INT);
$statement->execute();

但是,切換到TINYINT(1) 是首選解決方案,因為它在不同資料類型之間提供一致的行為,並確保與各種客戶端的兼容性圖書館。

以上是為什麼將 0 插入 MySQL BIT(1) 欄位會得到 1?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn