4

以下の動作に困惑しています。SELECT最初のステートメントは 1 を返し、2 番目のステートメントは 0 を返すのはなぜですか? 日付がリテラル以上であるため、両方が 1 を返すことを期待しています。

照合が日付の比較に影響するのはなぜですか? 日付をリテラルと比較するとき、日付 (または日時) を文字列として表現するのは間違っていますか? もしそうなら、どのように日付とリテラルの比較を行うべきですか?

mysql> CREATE DATABASE テスト;
クエリ OK、影響を受ける 1 行 (0.00 秒)

mysql> テストを使用します。

mysql> SET NAMES utf8 COLLATE utf8_general_ci;
クエリ OK、影響を受ける行は 0 (0.00 秒)

mysql> CREATE TABLE foo (
  バーの日付 NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
クエリ OK、影響を受ける行は 0 (0.15 秒)

mysql> INSERT INTO foo (バー) 値 ('2013-01-01');
クエリ OK、影響を受ける 1 行 (0.00 秒)

mysql> SELECT COUNT(*) FROM foo WHERE バー >= '2013-01-01 00:00:00';
+---------+
| | カウント(*) |
+---------+
| | 1 |
+---------+
セットで 1 行 (0.00 秒)

mysql> SET NAMES utf8 COLLATE utf8_unicode_ci;
クエリ OK、影響を受ける行は 0 (0.00 秒)

mysql> SELECT COUNT(*) FROM foo WHERE バー >= '2013-01-01 00:00:00';
+---------+
| | カウント(*) |
+---------+
| | 0 |
+---------+
セットで 1 行 (0.00 秒)

4

2 に答える 2

0

おそらく、dbがリテラル文字列のIMPLICIT型の変換を実行して日付に変換し、日付を比較していると想定します。dbが日付を文字列にIMPLICIT型変換し、文字列を比較しているようです。照合はこの変換に影響を与えるため、結果に影響を与えます。

試す:

SET NAMES utf8 COLLATE utf8_general_ci;

SELECT * FROM foo;

SET NAMES utf8 COLLATE utf8_unicode_ci;

SELECT * FROM foo;

2つのクエリは、動作を説明する異なる結果を提供する必要があります。

いずれにせよ、リテラル文字列を日付に明示的に変換してから日付を比較するようにdbに指示しているため、chaの提案は機能します。

于 2013-02-26T04:25:40.007 に答える
0

やってみました

SELECT COUNT(*) FROM foo WHERE bar >= _utf8'2013-01-01 00:00:00'

解説はこちら

于 2013-02-26T03:52:17.087 に答える