1

誰かがそのクエリで理由を説明できますか:

SELECT * FROM `tags` WHERE (tag IN ('willa-lentza', 2016))

tagsテーブルからすべての行を返しますが、2016引用符で囲むとうまくいきますか?

tag列はvarcharタイプです。

サンプル環境

CREATE TABLE  `tags` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `tag` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

INSERT INTO `tags` (`id`, `tag`) VALUES
  (1, '2016'),
  (2, 'plum'),
  (3, 'banana'),
  (4, 'apple'),
  (5, 'willa-lentza');

Roland Bouman が得たのと同じエラーも発生します。

Truncated incorrect DOUBLE value: 'willa-lentza'
4

4 に答える 4

4

引用符で囲まれた値 (文字列など) と引用符で囲まれていない値 (数値など) の比較規則が異なるため、IN リストで引用符で囲まれた値と引用されていない値を混在させないでください。したがって、タイプを混合すると、一貫性のない結果が生じる可能性があります。

http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_in

于 2010-01-14T14:46:40.933 に答える
1

面白い・・・これはわかった。

mysql> select 'a' in (0, 'b');
+-----------------+
| 'a' in (0, 'b') |
+-----------------+
|               1 |
+-----------------+
1 row in set, 1 warning (0.00 sec)

Warning (Code 1292): Truncated incorrect DOUBLE value: 'a'

編集:実際、私はこれを説明できると思います。(0 は in リストにあるため、mysql は in リストの残りの部分と左側の引数 'a' はすべて数値であると見なします。'a' をキャストすると 0 になるため、これは内部的に次のように見なされます。0 in (0, 0)

しかし、私はまだOPの動作を説明できません

于 2010-01-14T14:41:24.893 に答える
0

この動作を再現することはできませんが、あなたvarcharsは a にキャストされ、DOUBLEsその逆ではないようです。

この場合、クエリは次のようになります。

SELECT  *
FROM    tags
WHERE   CAST(tag AS DOUBLE) /* =0 for non-numeric tags */ IN (CAST('willa-lentza AS DOUBLE) /* = 0 */, 2016)

これは、すべての非数値タグに常に当てはまります。

この声明を実行EXPLAIN EXTENDED SELECT ...して、ここに警告を投稿していただけますか?

この動作を確認するために、別の数値タグを追加できます。

INSERT
INTO    tags
VALUES  (6, '1000')

このタグは、どちらのクエリからも返されません。

これを回避するには、常に定数を一重引用符で囲み、次のように解析されるようにします。CHARs

于 2010-01-14T14:51:07.227 に答える
0

私の簡単なテストでは、この動作は確認されていません。

SELECT 'test' IN ('other-string', 2016) /* returns 0 */

任意の文字列が整数に一致できる必要はありません。他に何も変更していないことを確認しますか?

于 2010-01-14T14:39:11.277 に答える