ホームページ  >  記事  >  データベース  >  MySQL BIT(1) フィールドに 0 を挿入すると 1 になるのはなぜですか?

MySQL BIT(1) フィールドに 0 を挿入すると 1 になるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-03 05:42:02847ブラウズ

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

MySQL BIT(1) フィールドに 0 を挿入すると 1 になる: 問題と解決策

PDO プリペアド ステートメントを使用する MySQL の BIT(1) フィールドでは、予期せず値 1 がテーブルに書き込まれます。この現象は、さまざまな形式のパラメーター バインディングや生の SQL を使用しているにもかかわらず発生しますが、値 0​​ を挿入する場合にのみ発生します。

0 の挿入でプレースホルダーが失敗する理由

BIT 列MySQL の はバイナリ型であるため、PDO などのクライアント ライブラリとの互換性の問題が発生する可能性があります。この問題は次の理由で発生します。

  • BIT 列はバイト位置に揃えられており、指定されたサイズに関係なく、各行に全バイトが消費されます。
  • PDO は 0 を誤って解釈します。バイト アライメントの問題により、値はビット 1 として返されます。

解決策: 代わりに TINYINT(1) を使用してください

この問題を解決するには、次のように変更することをお勧めします。 BIT(1) から TINYINT(1) までの列タイプ。これにより、挿入された値に関係なく、各行に 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) に切り替えることは、さまざまなデータ型間で一貫した動作を提供し、さまざまなクライアントとの互換性を確保するため、推奨される解決策です。ライブラリ。

以上がMySQL BIT(1) フィールドに 0 を挿入すると 1 になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。