MySql C-Api: sind Anfragen NULL-terminiert?



  • Hallo

    folgendes:

    // Alle Zeilen des ergebnisses Zeilenweise durchlaufen
        while (MYSQL_ROW row = mysql_fetch_row(result))
        {
        // ein Array von long's, enthält die Größe der einzelnen Daten
        unsigned long * lengths = mysql_fetch_lengths(result);
    
            // Alle Spalten der aktuellen Zeile durchlaufen
            for(int i = 0; i < num_fields; i++)
            {
            row[i]; // Hier Problem, siehe unten
            }
        }
    

    sooooo,
    kann ich mich drauf verlassen, dass row[i] NULL terminiert ist?

    Zitat aus der Doku:

    If row holds the return value from a call to mysql_fetch_row(), pointers to the values are accessed as row[0] to row[mysql_num_fields(result)-1]

    Würde ja bedeuten, dass nicht terminiert wird.

    Aber: (ebenfalls aus der Doku)

    printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL");
    

    hier wird's ja so verwendet, als wäre terminiert.

    Was is jetzt richtig?

    thx
    Martin

    PS:
    die Doku is hier:
    http://dev.mysql.com/doc/mysql/en/mysql-fetch-row.html



  • Was verstehst du unter Null-Terminiert und wofür ist das wichtig?



  • Angenommen, ein Datenbankfeld ist vom Typ "INT".

    Als Abfrageergebnis kommt aber dann nicht ein int zurück,
    sondern das Ergebnis liegt ASCII Codiert vor,
    d. h. es ist ein ganz normaler "char *".

    Zusätzlich kriegt man noch die Länge der Daten mitgeliefert.

    Bsp:
    In der aktuellen Zeile stehe in der ersten Spalte 412.

    row[0] ist dann ein char * auf die 4,
    die Länge der Daten ist 3.

    Nun ist meine Frage, ob ich mich drauf verlassen kann, dass hinter dem 412 noch eine binäre Null kommt, die den String terminiert.
    Oder muss ich erst die drei Zeichen in ein neues Array reinkopieren und die \0 selber anhängen?

    thx
    Martin



  • Das hat nichts mit MySQL zu tun.

    Die definition sagt vereinfacht:


Anmelden zum Antworten