Kalle_B: strlen bei UTF8

Hallöle,

ich habe in der Datenbank MySQL ein Feld varchar(50) utf8_unicode_ci

Passen da nun 50 Zeichen hinein oder "nur" 50 Bytes?

Bei der Eingabe des Feldes prüfe ich die Länge mit mb_strlen(), ob kleiner als 51.

LG Kalle

  1. Hi,

    ich habe in der Datenbank MySQL ein Feld varchar(50) utf8_unicode_ci

    Passen da nun 50 Zeichen hinein oder "nur" 50 Bytes?

    http://dev.mysql.com/doc/refman/4.1/en/char.html

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. http://dev.mysql.com/doc/refman/4.1/en/char.html

      nicht hilreich. Enthält nur Beispiele mit lateinischen Buchstaben, die Suche nach "utf" auf der Seite gibt kein Ergebnis.

      Kalle

      1. Habe mal die 15 kyrillischen Zeichen 'За нарушение ср' eingegeben.

        echo "mb_strlen( arr_in['besucher_vname'] )=[".mb_strlen( $arr_in['besucher_vname'] )."]<br>";

        gibt aus:

        mb_strlen( arr_in['besucher_vname'] )=[28]

        Was'n das?

        Kalle

        1. echo $begrüßung;

          Habe mal die 15 kyrillischen Zeichen 'За нарушение ср' eingegeben.
          gibt aus:
          mb_strlen( arr_in['besucher_vname'] )=[28]
          Was'n das?

          Ein Denkfehler. Das sind nur 13 kyrillische Zeichen und zwei ASCII-Leerzeichen.

          echo "$verabschiedung $name";

          1. echo $begrüßung;

            Habe mal die 15 kyrillischen Zeichen 'За нарушение ср' eingegeben.
            gibt aus:
            mb_strlen( arr_in['besucher_vname'] )=[28]
            Was'n das?

            Ein Denkfehler. Das sind nur 13 kyrillische Zeichen und zwei ASCII-Leerzeichen.

            Du meinst, PHP "denkt" falsch?

            Wie erreiche ich, dass ich 15 Zeichen in UTF8 korrekt zählen kann?

            Kalle

            1. echo $begrüßung;

              Was'n das?
              Ein Denkfehler. Das sind nur 13 kyrillische Zeichen und zwei ASCII-Leerzeichen.
              Du meinst, PHP "denkt" falsch?

              Entschuldige bitte, ich hatte bei der Interpretation des "Was'n das?" einen Fehler gemacht. Ich nahm an, dass du dich über die 28 statt einer 30 wundertest.

              PHP denkt nicht. Das zählt nur stur nach den ihm vorliegenden Parametern.

              echo "$verabschiedung $name";

          2. Hallo,

            Habe mal die 15 kyrillischen Zeichen 'За нарушение ср' eingegeben.
            gibt aus:
            mb_strlen( arr_in['besucher_vname'] )=[28]
            Was'n das?
            Ein Denkfehler. Das sind nur 13 kyrillische Zeichen und zwei ASCII-Leerzeichen.

            das ergibt 15 Zeichen, nicht 28.
            Jedenfalls, wenn man mb_strlen() richtig anwendet.

            So long,
             Martin

            --
            Eine Nonne kommt in den Himmel. An der Pforte fragt Petrus: "Wer bist du?" - "Ich bin die Braut Jesu." Petrus stutzt einen Moment, ruft dann nach hinten: "He Freunde, habt ihr schon gehört? Der Juniorchef will heiraten!"
        2. mb_strlen( arr_in['besucher_vname'] )=[28]

          Laut Anleitung hat die Funktion noch einen weiteren, optionalen Parameter, das verwendete Encoding. Ohne ihn wird das interne Encoding verwendet. Vermutlich ist das der Fehler.

          --
          Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
          Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
          1. Hallo, Timo,

            mb_strlen( arr_in['besucher_vname'] )=[28]
            Laut Anleitung hat die Funktion noch einen weiteren, optionalen Parameter, das verwendete Encoding. Ohne ihn wird das interne Encoding verwendet. Vermutlich ist das der Fehler.

            Ja. Es war ein langer Tag und ich habe etwas länger gebraucht.

            mb_strlen( arr_in['besucher_vname'], 'utf8' )

            lifert das richtige Ergebnis, danke.

            Kalle

      2. echo $begrüßung;

        http://dev.mysql.com/doc/refman/4.1/en/char.html
        nicht hilreich. Enthält nur Beispiele mit lateinischen Buchstaben, die Suche nach "utf" auf der Seite gibt kein Ergebnis.

        Es gibt ja auch noch mehr Mehrbyte-Kodierungen als UTF-8. Die werden nicht unterschiedlich gehandhabt, weswegen du da keinen direkte Nennung von UTF-8 erwarten darfst.
        Das Handbuch spricht von "number of characters" nicht von Bytes. Und da MySQL schon seit Version 4.1 nicht mehr 1 Zeichen = 1 Byte gleichsetzt, sollte das auch Zeichen meinen und nicht Bytes (was in der Tat auch so ist. Ein kurzer Versuch mit phpMyAdmin einen x-buchstabigen Wert mit Umlaut drin in einem (VAR)CHAR(x) abzulegen, hätte die Frage auch beantwortet.

        Beachte auch den Unterschied zwischen den Funktionen LENGTH() und CHAR_LENGTH()

        echo "$verabschiedung $name";

        1. Hello,

          Ein kurzer Versuch mit phpMyAdmin einen x-buchstabigen Wert mit Umlaut drin in einem (VAR)CHAR(x) abzulegen, hätte die Frage auch beantwortet.

          Das kann aber in die Hose gehen.
          Wenn ich mich recht erinnere, wird, wenm in der Tabelle auch nur eine einzige Varchar-Spalte wäre, auch die Char-Spalte als Varchar-Spalte angelegt.

          Oder irre ich mich jetzt?

          Liebe Grüße aus Syburg bei Dortmund

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. echo $begrüßung;

            Wenn ich mich recht erinnere, wird, wenm in der Tabelle auch nur eine einzige Varchar-Spalte wäre, auch die Char-Spalte als Varchar-Spalte angelegt.
            Oder irre ich mich jetzt?

            Das ist für das Problem irrelevant. Die Länge des Feldes ändert sich dadurch nicht. Außerdem passiert das seit 5.0.3 nicht mehr. Silent Column Specification Changes

            echo "$verabschiedung $name";

      3. Hi,

        http://dev.mysql.com/doc/refman/4.1/en/char.html

        nicht hilreich.

        War mir schon beim Antworten klar - weil ich ja wusste, wem ich antworte.
        Ich wollte nur die Moeglichkeit, dass du mich ueberraschst, doch nicht ganz von vornherein ausschliessen.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“