Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Das kroatische Alphabet bringt mich noch um....

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Das kroatische Alphabet bringt mich noch um....

    Sollte eingentlich kein grosses Problem sein, ist aber - zumindest für mich:

    Ich hab hier ne kleine CSV-Datei mit 5 Datensaetzen (also 5 Zeilen) drin mit jeweils 10 Werten. Die will ich gerne in meine kleine MySQL-Datenbank importieren mit Hilfe von PHP:

    1;Puntijarka;1;Lesjak;Goran;9999.12.31;00:29:56;M S;0;62.5835
    2;Puntijarka;2;Žalac;Darko;9999.12.31;00:30:15;M S;0;61.7355
    3;Puntijarka;3;Vrdoljak;Ivan;9999.12.31;00:30:51;M S;0;60.5577
    4;Puntijarka;4;Trivanovic;Relja;9999.12.31;00:31:4 2;M40;0;59.1253
    5;Puntijarka;5;Jurišic;Veronika;9999.12.31;00:31:4 9;Ž S;0;58.5406

    Wie ihr seht, sind da einige spezielle Buchstaben drin.

    Mit dem folgenden Code importieren ich die Daten, was auch ganz gut funktioniert, mit Ausnahme diser speziellen Buchstaben

    PHP-Code:
    <html xmlns="http://www.w3.org/1999/xhtml">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <head>
      <title>Hello!</title>
    </head>
    <body>

    <?php

    $link 
    mysql_connect("localhost""AKS_User""xxxxx")
    or die(
    "Keine Verbindung möglich: " mysql_error());
    echo 
    "Verbindung zum Datenbankserver erfolgreich<br>";
    mysql_select_db("AKS_Liga_Results") or die("Auswahl der Datenbank fehlgeschlagen");

    mysql_query('SET NAMES "utf8";');
    mysql_query('SET CHARACTER SET utf8;');

    $sql "LOAD DATA INFILE 'c:/www/test/liga_results_test_2.csv' IGNORE INTO TABLE liga_results
    FIELDS TERMINATED BY ';' lines terminated by '\r\n'"
    ;
    $result mysql_query($sql);
    echo 
    mysql_error();
    echo 
    $result;

        
    //tabelle ausgeben
        
    $abfrage "SELECT result_id, surname, name FROM liga_results";
        
    $ergebnis mysql_query($abfrage);
        while(
    $row mysql_fetch_object($ergebnis))
        {
            echo 
    "$row->result_id$row->name$row->surname <br>";
        }

        
    //verbindung beenden
        
    mysql_close($link);

    ?>

    </body>
    </html>
    Zu Testzwecken gebe ich am Ende ein paar Daten aus, da fehlt dann allerdings was: Der spezielle Buchstabe fehlt und der Rest in dem Datenfeld
    (z.B. Statt "5, Veronika, Jurišic" steht da bloß "5, Veronika, Juri"

    Ausgabe auf Bildschirm:
    +++
    Verbindung zum Datenbankserver erfolgreich1
    4, Relja, Trivanovic
    3, Ivan, Vrdoljak
    2, Darko,
    1, Goran, Lesjak
    5, Veronika, Juri
    ++++

    Die VARCHAR-Felder in der Tabelle sind mit utf8_unicode_ci formatiert (ich weiss nicht, ob hier "formatiert" das richtige Wort ist, sorry).

    Was kann ich noch tun?

    Vielen Dank fuer Feedback.

    Bodo

  • #2
    lass mysql_query('SET NAMES "utf8";'); weg und nimm statt mysql_query('SET CHARACTER SET utf8;'); das hier: PHP: mysql_set_charset - Manual

    außerdem schau dir mal die PHP: Multibyte String Funktionen - Manual an
    [IMG]http://media.ubuntuusers.de/portal/files/ubuntu.png[/IMG][IMG]http://sqlmanager.net/i/ico/mysql.gif[/IMG][SIGPIC][/SIGPIC]

    Kommentar


    • #3
      Gib mal das Charset auch bei LOAD DATA mit an.

      Zitat von http://dev.mysql.com/doc/refman/5.0/en/load-data.html
      12.2.5. LOAD DATA INFILE Syntax

      LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
      [REPLACE | IGNORE]
      INTO TABLE tbl_name
      [CHARACTER SET charset_name]
      [FIELDS
      [TERMINATED BY 'string']
      [[OPTIONALLY] ENCLOSED BY 'char']
      [ESCAPED BY 'char']
      ]
      [LINES
      [STARTING BY 'string']
      [TERMINATED BY 'string']
      ]
      [IGNORE number LINES]
      [(col_name_or_user_var,...)]
      [SET col_name = expr,...]
      The character set indicated by the character_set_database system variable is used to interpret the information in the file. SET NAMES and the setting of character_set_client do not affect interpretation of input. If the contents of the input file use a character set that differs from the default, it is usually preferable to specify the character set of the file by using the CHARACTER SET clause, which is available as of MySQL 5.1.17.

      Kommentar


      • #4
        Hmm, Frank und David, vielen Dank erstmal fuer Eure Blitzantwort.
        Ich hab beides eingebaut:

        PHP-Code:
        <html xmlns="http://www.w3.org/1999/xhtml">

        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
          <title>Hello!</title>
        </head>
        <body>

        <?php

        $link 
        mysql_connect("localhost""root""xxxxx")
        or die(
        "Keine Verbindung möglich: " mysql_error());
        echo 
        "Verbindung zum Datenbankserver erfolgreich";
        mysql_select_db("aks_liga_results") or die("Auswahl der Datenbank fehlgeschlagen");

        //mysql_query('SET NAMES "utf8";');
        //mysql_query('SET CHARACTER SET utf8;');

         
        if (function_exists('mysql_set_charset') === false) {
             
        /**
              * Sets the client character set.
              *
              * Note: This function requires MySQL 5.0.7 or later.
              *
              * @see http://www.php.net/mysql-set-charset
              * @param string $charset A valid character set name
              * @param resource $link_identifier The MySQL connection
              * @return TRUE on success or FALSE on failure
              */
             
        function mysql_set_charset($charset$link null)
             {
                 if (
        $link == null) {
                     return 
        mysql_query('SET NAMES "UTF8"');
                 } else {
                     return 
        mysql_query('SET NAMES "UTF8"'$link);
                 }
             }
         }

        $sql "LOAD DATA INFILE 'c:/www/test/liga_results_test_2.csv' IGNORE INTO TABLE liga_results
        CHARACTER SET utf8
        FIELDS TERMINATED BY ';'
        lines terminated by '\r\n'"
        ;
        $result mysql_query($sql);
        echo 
        mysql_error();
        echo 
        $result;
        echo 
        "<br>";

            
        //tabelle ausgeben
            
        $abfrage "SELECT result_id, surname, name FROM liga_results order by result_id desc";
            
        $ergebnis mysql_query($abfrage);
            while(
        $row mysql_fetch_object($ergebnis))
            {
                echo 
        "$row->result_id$row->name$row->surname <br>";
            }


            
        //verbindung beenden
            
        mysql_close($link);

        ?>

        </body>
        </html>
        Ergebnis ist leider das gleiche.

        Komisch ist auch, dass wenn ich mit PHPMYADMIN direkt die Tabellenwerte ändere und dann wieder auslese, wird alles korrekt angezeigt. Nur das Importieren funktioniert irgendwie nicht. Zumindest akzeptiert die Datanbanktabelle diese speziellen Buchstaben, ist ja schonmal was.

        Ich steh uebrigens schon seit drei Tagen hiermit auf dem Schlauch und hab' Foren durchgestoebert und Tutorials gelesen.... kein Erfolg.

        Habt ihr vielleicht noch ne Idee?

        Danke vielmals.

        Bodo

        Kommentar


        • #5
          PHP-Code:
          <?php
          $link 
          mysql_connect("localhost""root""xxxxx")
          or die(
          "Keine Verbindung möglich: " mysql_error());
          echo 
          "Verbindung zum Datenbankserver erfolgreich";
          mysql_select_db("aks_liga_results"$link) or die("Auswahl der Datenbank fehlgeschlagen");

          $sql "SHOW Variables LIKE '%character%'";
          $result mysql_query($sql$link) or die(mysql_error());
          while(
          $row=mysql_fetch_array($resultMYSQL_NUM))
          {
            echo 
          $row[0].'='.$row[1]."<br />\n";
          }
          $sql 'SELECT Version(), @@character_set_database';
          $result mysql_query($sql$link) or die(mysql_error());
          while(
          $row=mysql_fetch_array($resultMYSQL_NUM))
          {
            echo 
          $row[0].', '.$row[1]."<br />\n";
          }
          echo 
          '.';
          Was wird ausgegeben?

          Kommentar


          • #6
            Ich hatte eine ähnliche Aufgabenstellung mit polnischen Daten.

            Probier mal sofort nach dem Verbinden zur Datenbank das hier:
            PHP-Code:
            mysql_query("SET NAMES 'utf8'"); 
            zusätzlich hab ich am Anfang des Importscriptes noch
            PHP-Code:
            header("Content-Type: text/html; charset=UTF-8"); 
            , bin mir aber nicht sicher, ob das nur ein Überbleibsel eines der vielen erfolglosen Versuche ist.

            hth
            Wolla


            Nachtrag:
            Ich mache das Importieren durch Zeilenweises Lesen der CSV-Datei, Splitten der Felder am Trennzeichen (, und normalem INSERT INTO tabelle ....
            Das einzig Spezielle sind die o.a. Anweisungen SET NAMES und header.
            [PHP]if ($var != 0) {
            $var = 0;
            }[/PHP]

            Kommentar


            • #7
              Die Ausgabe:

              Verbindung zum Datenbankserver erfolgreichcharacter_set_client=latin1
              character_set_connection=latin1
              character_set_database=utf8
              character_set_filesystem=binary
              character_set_results=latin1
              character_set_server=latin1
              character_set_system=utf8
              character_sets_dir=C:\Programme\MySQL\MySQL Server 5.0\share\charsets\
              5.0.51b-community-nt, utf8


              Hmmm wo kommt denn da der latin1 her?

              Kommentar


              • #8
                Du meinst bei character_set_client und character_set_connection?
                Das ist die Standardeinstellung der verwendeten libmysql.dll. Das würde mit SET NAMES geändert werden, hat aber laut Doku keinen Einfluss aus LOAD DATA INFILE. Wichtig ist der Wert character_set_database=utf8.
                Nebenbei: Die Angabe von CHARACTER SET hat keine Wirkung, wegen
                it is usually preferable to specify the character set of the file by using the CHARACTER SET clause, which is available as of MySQL 5.1.17
                Du benutzt 5.0.51b.
                Erstmal noch ein weiterer Test - nur zur Sicherheit.
                PHP-Code:
                <?php
                $c 
                file_get_contents('c:/www/test/liga_results_test_2.csv');
                // 30.Buchstabe(groß) im kroatischen Alphabet, [url=http://en.wikipedia.org/wiki/%C5%BD]Ž - Wikipedia, the free encyclopedia[/url] 
                $Z chr(0xC5) . chr(0xBD);
                var_dump(strlen($c), strpos($c$Z));

                Kommentar


                • #9
                  David, das Ergebnis:

                  int(443) bool(false)


                  Ergaenzung:
                  Nur zur Info, ich benutze zum Programmieren eine Apache/MySQL/PHP-Umgebung bei mir auf dem PC (MYSQL 5.051b ist also auf meinem PC installiert). Und bei meinem Hoster, wo der ganze Kram spaeter funktionieren soll, ist die Version 5.0.45 installiert

                  Dort gibts folgende Ausgabe auf dein Script:

                  Verbindung zum Datenbankserver erfolgreichcharacter_set_client=latin1
                  character_set_connection=latin1
                  character_set_database=utf8
                  character_set_filesystem=binary
                  character_set_results=latin1
                  character_set_server=latin1
                  character_set_system=utf8
                  character_sets_dir=/usr/share/mysql/charsets/
                  5.0.45, utf8

                  Kommentar


                  • #10
                    In der Datei steht zwar etwas, aber kein utf-8 codiertes Ž

                    Kommentar


                    • #11
                      HMMM, wenn ich die CSV oeffne, dann steht da allerdings genau das drin:

                      1;Puntijarka;1;Lesjak;Goran;9999.12.31;00:29:56;M S;0;62.5835
                      2;Puntijarka;2;Žalac;Darko;9999.12.31;00:30:15;M S;0;61.7355
                      3;Puntijarka;3;Vrdoljak;Ivan;9999.12.31;00:30:51;M S;0;60.5577
                      4;Puntijarka;4;Trivanovic;Relja;9999.12.31;00:31:4 2;M40;0;59.1253
                      5;Puntijarka;5;Jurišic;Veronika;9999.12.31;00:31:4 9;Ž S;0;58.5406

                      ...also inkl Ž. Sehr merkwuerdig.

                      Kommentar


                      • #12
                        Das Zeichen kann ja auch anders als utf-8 codiert sein.
                        PHP-Code:
                        <?php
                        foreach(file('c:/www/test/liga_results_test_2.csv') as $r)
                        {
                          if (
                        0===strpos($r'2;'))
                          {
                            for(
                        $i=0$i<strlen($r); $i++)
                            {
                              
                        printf('%02X 'ord($r[$i]));
                            }    
                          }
                        }

                        Kommentar


                        • #13
                          David, das Ergebnis....

                          32 3B 50 75 6E 74 69 6A 61 72 6B 61 3B 32 30 30 33 3B 32 30 30 33 2E 30 38 2E 32 38 3B 31 30 3B 64 75 67 61 3B 32 3B 8E 61 6C 61 63 3B 44 61 72 6B 6F 3B 39 39 39 39 2E 31 32 2E 33 31 3B 30 30 3A 33 30 3A 31 35 3B 4D 20 53 3B 30 3B 36 31 2E 37 33 35 35 0D 0A

                          Kommentar


                          • #14
                            Das ist die iso-8859-1 Codierung für
                            2;Puntijarka;2003;2003.08.28;10;duga;2;Žalac;Darko ;9999.12.31;00:30:15;M S;0;61.7355
                            Kein utf-8

                            Korrektur: Es ist die Windows-1252 Codierung, nicht iso-8859.

                            Kommentar


                            • #15
                              Nun hab ich meine CSV nochmal in einem Texteditor (Ultraedit) geladen und als UTF8 gespeichert. Dann kommt das raus, wenn ich Dein Script drueber laufen lasse:

                              32 3B 50 75 6E 74 69 6A 61 72 6B 61 3B 32 30 30 33 3B 32 30 30 33 2E 30 38 2E 32 38 3B 31 30 3B 64 75 67 61 3B 32 3B C5 BD 61 6C 61 63 3B 44 61 72 6B 6F 3B 39 39 39 39 2E 31 32 2E 33 31 3B 30 30 3A 33 30 3A 31 35 3B 4D 20 53 3B 30 3B 36 31 2E 37 33 35 35 0D 0A

                              dein zweites Script bringt nun: int(446) int(126)


                              Vorher wars uebrigens das:
                              32 3B 50 75 6E 74 69 6A 61 72 6B 61 3B 32 30 30 33 3B 32 30 30 33 2E 30 38 2E 32 38 3B 31 30 3B 64 75 67 61 3B 32 3B 8E 61 6C 61 63 3B 44 61 72 6B 6F 3B 39 39 39 39 2E 31 32 2E 33 31 3B 30 30 3A 33 30 3A 31 35 3B 4D 20 53 3B 30 3B 36 31 2E 37 33 35 35 0D 0A


                              Das CSV-File mit UTF8-Codierung habe ich dann nochmal mit dem PHP geladen: LEIDER aendert sich nichts, noch immer wird das spezielle Zeichen plus alle nachfolgenden nicht geladen.

                              Kommentar

                              Lädt...
                              X