31

BOOL次のスクリプトを使用して、MySQL (v 5.5.20)のデータ型に値を挿入しようとしています。

CREATE DATABASE DBTest;
USE DBTest;
DROP TABLE IF EXISTS first;
CREATE TABLE first (id INT AUTO_INCREMENT NOT NULL PRIMARY KEY , name VARCHAR(30) ,sale  BOOL,); 
INSERT INTO first VALUES ("", "G22","TRUE");
INSERT INTO first VALUES ("", "G23","FALSE");

しかし、この INSERTステートメントは、とオプション0の両方のブール列に (Zero) を挿入するだけです! なぜこれが起こっているのか教えてください。TRUEFALSE

4

1 に答える 1

60

TRUEおよびFALSEはキーワードであり、文字列として引用しないでください。

INSERT INTO first VALUES (NULL, 'G22', TRUE);
INSERT INTO first VALUES (NULL, 'G23', FALSE);

それらを文字列として引用することにより、MySQLはそれらを同等の整数にキャストします(ブール値は実際にINTはMySQLでは1バイトであるため)。これは、数値以外の文字列の場合はゼロに変換されます。したがって、0テーブル内の両方の値を取得します。

ゼロにキャストされた非数値文字列:

mysql> SELECT CAST('TRUE' AS SIGNED), CAST('FALSE' AS SIGNED), CAST('12345' AS SIGNED);
+------------------------+-------------------------+-------------------------+
| CAST('TRUE' AS SIGNED) | CAST('FALSE' AS SIGNED) | CAST('12345' AS SIGNED) |
+------------------------+-------------------------+-------------------------+
|                      0 |                       0 |                   12345 |
+------------------------+-------------------------+-------------------------+

ただし、キーワードは対応するINT表現を返します。

mysql> SELECT TRUE, FALSE;
+------+-------+
| TRUE | FALSE |
+------+-------+
|    1 |     0 |
+------+-------+

また、より標準的なSQL文字列エンクロージャーと同様に、二重引用符を一重引用符に置き換えたことにも注意してください。最後に、空の文字列をに置き換えましidNULL。空の文字列は警告を発行する場合があります。

于 2012-11-06T21:25:19.697 に答える