php / php/php-src

mysqlnd: Fractional seconds truncated in prepared statements, if value of decimals is AUTO_SEC_PART_DIGITS (=39).

Offen
#16,910 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bug Extension: mysqlnd
Vorherrschende Sprache
C
Sterne
40.4k
Forks
8.2k
Ø Merge
2 T. 13 Std.
Gemergte PRs (30 T.)
96

Beschreibung

Description

This issue was initially reported for MariaDB Connector/C (which uses part of mysqlnd):

In some cases both MySQL and MariaDB server will send the value 39 (=AUTO_SEC_PART_DIGITS) for datetime and time decimals. The binary protocol implementation however will only set fractional seconds if decimals is <= 6.

The following code:

<?php

$link= mysqli_connect("localhost", "georg", null, "test", 0, "/tmp/mysql.sock");

$stmt = $link->prepare("select FROM_UNIXTIME('1992.1'), FROM_UNIXTIME('1992.0')");
$stmt->execute();
$stmt->bind_result($binval[0],$binval[1]);
$stmt->fetch();
$stmt->close();

$result = $link->query("select FROM_UNIXTIME('1992.1'), FROM_UNIXTIME('1992.0')");
$txtval = $result->fetch_row();
$result->close();
$err_cnt= 0;

for ($i=0; $i < 2; $i++)
    if ($txtval[$i] != $binval[$i])
        printf("[%03d] Expected '%s' (text protocol), got '%s' (binary protocol)\n",
               $err_cnt++, $txtval[$i], $binval[$i]);

printf("Done!\n");
?>

Resulted in this output:

[000] Expected '1970-01-01 01:33:12.100000' (text protocol), got '1970-01-01 01:33:12' (binary protocol)
Done!

But I expected this output instead:

Done!

Metadata sent by server:

$> mariadb --column-type-info -e"select from_unixtime('1922.1')"
Field   1:  `from_unixtime('1922.1')`
Org_field:  ``
Catalog:    `def`
Database:   ``
Table:      ``
Org_table:  ``
Type:       DATETIME
Collation:  binary (63)
Length:     26
Max_length: 26
Decimals:   39
Flags:      BINARY 

PHP Version

PHP 8.4.0-dev

Operating System

No response

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginnen Sie mit mysqlnds Verarbeitung der Binärprotokolle für DATETIME- und TIME-Metadaten, wobei Sie die bereitgestellte Reproduktion für mysqli-Prepared-Statements und deren Vergleich mit dem Textprotokoll verwenden. Prüfen Sie den Fall, in dem der Server Dezimalstellen als 39 (AUTO_SEC_PART_DIGITS) meldet, und fügen Sie dann eine Regressionstestabdeckung hinzu oder aktualisieren Sie sie, sodass Nachkommasekunden erhalten bleiben und der Vergleich „Done!“ ausgibt. از

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
c, mysql, php
Bereich
databases
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
45/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.