2016-07-19 6 views
2

Ich habe eine Abfrage, die fälschlicherweise die Funktion konstruiert sind ‚now()‘ als String:mysql behandelt die Zeichenfolge 'now()' als Datetime?

select Listing.id,Listing.reactivated FROM `listings` AS Listing WHERE Listing.reactivated < 'now()'; 

aber tatsächlich diese Abfrage in der Lage, korrekte Ergebnisse mit MySQL 5.5 zurück:

| 26662 | 2007-06-04 21:42:51 | 
| 26663 | 2007-06-04 21:46:34 | 

tatsächlich funktionieren mehrere Datumsfunktionen auch ohne Klammern; like 'jetzt' oder 'curdate', aber ein einfaches, 'select' now() '; ", wird eine Zeichenkette zurückgeben.

Eigentlich Ich habe dies bemerkt, wenn wir Mysql auf MariaDB 10.1 aktualisiert haben, wo es aufgehört zu arbeiten, das Ergebnis der obigen Abfrage ist eine Nullmenge, und eine Warnung:

| Warning | 1292 | Incorrect datetime value: 'NOW()' | 

Ich verstehe, wir sollten beheben die Abfragen :), aber ich möchte fragen, ob jemand den Grund dafür kennt, wann dies geändert wurde, und auch, wenn dieses Verhalten konfiguriert werden kann?

+0

Es sieht nicht wie das Verhalten aus, das ich beobachte; Es sieht so aus, als ob ein Datetime weniger ist als ''now()' '. 'SELECT (jetzt() + INTERVALL 10 SEKUNDE) <'now()', (jetzt() + INTERVALL 10 SEKUNDE)> 'now()' ergibt (1, 0). – Uueerdo

+0

Ich finde, dass ein beliebiges String-Literal einen "gültigen" Vergleich mit einem Datumsfeld macht. 'SELECT * FROM mypasswords WHERE abläuft <'ndseow'' gibt keine Datensätze zurück. 'SELECT * FROM mypasswords WHERE läuft ab> 'ndseow'' gibt alle zurück. Wenn das Verhalten, das Sie gesehen haben, korrekt war, könnte es Zufall sein. –

+0

@Uueerdo Ich tat das und bekam Ihre Ergebnisse, und es gab auch die Warnungen 'Truncated incorrect datetime value: 'now()''. – aynber

Antwort

0

Die Dokumentation der Ansprüche Type Conversion in Expression Evaluation:

Wenn eines der Argumente eine TIMESTAMP oder DATETIME Spalte ist und das andere Argument eine Konstante ist, die Konstante in einen Zeitstempel umgewandelt wird, bevor der Vergleich durchgeführt wird.

Aber das scheint nicht zu sein, was in diesem Fall passiert, also könnte es ein Fehler sein. Es scheint, dass es das in eine Zeichenkette umwandelt und diese mit der Konstante vergleicht. Also, wenn die aktuelle Datetime 2016-07-19 15:13:06 ist, erhalten Sie das Ergebnis:

SELECT '2016-07-19 15:13:06' < 'now()'; 

Da Ziffern niedriger sind als Buchstaben in der Sortierfolge, diese zurück 1.

ich zu diesem Schluss kam von anderen Saiten versuchen:

SELECT NOW() < '300'; 

Dies gibt auch 1. Aber wenn ich es ändern:

SELECT NOW() < '100', NOW() < '!'; 

die Ergebnisse sind 0.

1

Verwenden Sie keine Anführungszeichen: 'NOW()'; einfach sagen NOW().

Die ehemalige ist Zeichenfolge, die keine gültige Datetime ist. (Dito für 'NOW' und 'XYZ'.)