1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. robbytobi

Beiträge von robbytobi

  • Zeichensatz-Probleme beim Schreiben in MariaDB

    • robbytobi
    • 27. Mai 2022 um 14:38

    So, jetzt hammas :)

    Mit der kleinen UDF kann ich die Strings dann auch korrekt auf die Konsole ausgeben:

    Code
    FUNC ConsoleWriteUTF8($sString)
        $sString = _WinAPI_WideCharToMultiByte($sString,65001)
        ConsoleWrite($sString)
    EndFunc


    Somit ist nun ENDLICH alles in UTF8 (mb4)

    Vielen Dank an alle die geholfen haben.

    Was den Einwand Hilfestellung vs Tutorial betrifft.

    Erst war's ne Hilfestellung, dann ein Tutorial, jetzt wurd's ne Hilfestellung....

    Fehlt: ein Tutorial. Werd ich machen. Allein schon, um meine Einstellungen zu dokumentieren...

  • Zeichensatz-Probleme beim Schreiben in MariaDB

    • robbytobi
    • 27. Mai 2022 um 14:08

    So. Habe nun noch eine weitere Fehlerquelle eliminiert:

    Es gibt einen speziellen ODBC-Treiber für MariaDB. (Den findest auch nicht gleich wenn du nicht ganz gezielt danach suchst.) Bislang war ich mit dem mysql-ODBC Treiber unterwegs weil es so irgendwo mal drin stand, Der dann zwar vieles, aber eben nicht alles richtig macht.

    Und damit lies sich dann die bisher mangelhafte Excel-Darstellung der Daten ebenfalls beheben. Somit ist nun die UTF-8 -Kette ziemlich konsistent:

    Input(Text) --> Array OK

    Array--> MariaDB OK

    MariaDB --> phpMyAdmin und dBeaver OK

    MariaDB--> Excel OK

    MariaDB--> Array OK

    Überall wird endlich das gleiche angezeigt. Nur die Konsole "sagt" noch was anderes. Aber das ist nun wenigstens auch konsequent falsch :)

    Derzeit/mittlerweile sind übrigens ALLE Konvertierungen ausgeschaltet. (!) (so wie es bitnugger eigentlich auch mal prophezeit hatte). Das heißt für mich, dass alles native durchgeht. Kann sein, dass ich für Konsole-Zwecke noch was spezielles mache. Allein schon um Klarheit darüber zu bekommen was wo passiert :)


  • Zeichensatz-Probleme beim Schreiben in MariaDB

    • robbytobi
    • 27. Mai 2022 um 10:36

    Ich hab das kurz per For-Schleife in den Array-Reader eingehängt:

    Nun passt's bei der Array-Darstellung (Und somit vermutlich für meine Weiterverarbeitung)

    allerdings ist nun die Console-Ausgabe Mist. :rolleyes:.

    Gut, damit könnte ich noch leben. Mir wär's aber lieber, wenn ich mal ALLES einfach auf UTF-8 einstellen könnte und in RUHE damit arbeiten.

    (Noch besser wär alles verstehen)

  • Zeichensatz-Probleme beim Schreiben in MariaDB

    • robbytobi
    • 27. Mai 2022 um 09:44

    Nein. Das Statement auf keinen Fall: Das, was ich an den Server sende ist ja komplett richtig. Inhalt und Zeichensatz passen da.

    Das, was dann vom Server kommt ist das Problem. Es passt in der Konsole, die offensichtlich korrekt (65001) eingestellt ist schon. Aber nicht im Array.

    Und nun ist das Problem, dass mich an dieser Stelle die Konsole herzlich wenig interessiert. Ich muß mit den Werten aus dem Array weiterarbeiten...

    Und ja: Ich hab das Array mit _WinAPI_WideCharToMultiByte($sSQLstring,65001) auch schon durchackern lassen. kam nix dabei raus.

  • Zeichensatz-Probleme beim Schreiben in MariaDB

    • robbytobi
    • 26. Mai 2022 um 22:07

    Hi Velted,

    das ist es ja: Ich weiß nicht ob es einer Konvertierung bedarf... Zumal die Konsole ja korrekt ausgibt.

    Das Array wird über diese kleine UDF aus dem Ergebnis der DB-Abfrage erzeugt:

    Code
    Func _GetArrayBySQL($sQuery, $aServer)
        ;Führt eine Abfrage mit einem beliebigen Statement durch und gibt ein entsprechendes Array zurück
        ;Ist das Ergebnis der Abfrage leer, wird -1 zurückgegeben
        
        Local $aResult = -1
        $oConn = _SQLConnect($aServer[0],$aServer[1],1,$aServer[2],$aServer[3],$aServer[4],$aServer[5])    ;Connect mit den Default-Serverdaten
        
        $oQueryResult = _SQLQuery($oConn, $sQuery)
        If  Not $oQueryResult.EOF Then
            $aResult = $oQueryResult.GetRows
        EndIf
    
        _SQLDisconnect($oConn)
        Return($aResult)
    EndFunc
    Alles anzeigen

    Ich habe zwar schon probiert das Array nochmals umzupflügen, hatte jedoch dabei keinen Erfolg (es wurd nur schlimmer)

  • Zeichensatz-Probleme beim Schreiben in MariaDB

    • robbytobi
    • 26. Mai 2022 um 14:50

    Leider nicht:

    Das reale Array aus der Datenbank beinhaltet RegEx-Ausdrücke; Diese werden der Reihe nach über einen Text gejagt. Leider sind diese Ausdrücke anscheinend genauso verkrüppelt. Ich werd das nochmal explizit prüfen. Aber so bin ich überhaupt drauf gekommen dass da was mit dem Import nicht stimmt...

    Aber zur Spurensuche: Kann _ArrayDisplay kein UTF8? Also bevor ich das Zeug sende stimmt ja alles. Hier das Array, welches zum DB-Insert gesendet wird:

    (Nicht böse sein wenn ich frag. Ich wills ja nur irgendwann mal verstehen)

  • Zeichensatz-Probleme beim Schreiben in MariaDB

    • robbytobi
    • 26. Mai 2022 um 12:47

    Hei zusammen,

    nachdem ich das Thema vermeintlich schon gelöst hatte (nochmals Dank an dieser Stelle für das erste Tauziehen:-) und auch Daten in meine Datenbank schreiben konnte, habe ich nun versucht sie auch wieder zu LESEN. (daher kein neuer Fred, hängt ja zusammen)

    Und jetzt wird's stange: Die Daten kommen 'richtig' in der Datenbank an und werden auch wieder "'richtig" in der Konsole ausgegeben. Aber im Array sind sie 'falsch'.

    Nun probier ich seit drei Tagen rum und hab z.B. die Daten auch schon mit Excel versucht aus der Datenbank zu lesen. Dort steht aber der selbe Quatsch wie im Array. (?!)

    Was mich natürlich stutzig macht:

    Hab im ODBC-Treiber nachgeschaut. Dort steht korrekt utf8mb4 (also 'echtes' UTF8) drin.

    Wie ihr euch sicher vorstellen könnt, hab ich einiges durchgelesen und ausprobiert. (Auch den einen Satz hier im Forum, dass sich das Thema irgendwann auswachsen könnte, hab ich gelesen. *schmunzel -schön wärs*). Bin also für jede Hilfe und Fährte dankbar.

    LG Robin

    PS: warum ich 'richtig' und 'falsch' schreibe? ->Weil ich mir ÜBERHAUPT NICHT mehr sicher bin was wann wo in welchem Format genau steht. Ich zweifel grad an allem....

    PPS: Die Daten auf der Datenbank schaue ich mit dBeaver und dem phpMyAdmin an. sieht korrekt aus...

  • Zeichensatz-Probleme beim Schreiben in MariaDB

    • robbytobi
    • 16. September 2021 um 13:31

    Anbei noch mal zusammenfassend die Einstellungen, die der Server zurückmelden sollte damit alles funktioniert

  • Zeichensatz-Probleme beim Schreiben in MariaDB

    • robbytobi
    • 16. September 2021 um 13:27

    #Topic Solved#

    Code
    ;$sSQLstring enthält ein gültiges SQL-Statement, das wie folgt konvertiert werden muß:
            $sSQLstringUTF8 = _WinAPI_WideCharToMultiByte($sSQLstring,65001)                ;Konvertierung
            ConsoleWrite($sSQLstringUTF8&@CRLF)                                              ;Ausgabe an Konsole
            $oQueryResult = _SQLQuery($oConn, $sSQLstringUTF8)                                ;Ausgabe an DB

    Das Problem war, dass MariaDB eine "ganz spezielle" Beziehung zu UTF8 hat! Auch wenn das nichts mehr mit AutoIt zu tun hat, will ich noch folgende Lösungsansätze hier posten, damit der nächste, der hier verzweifelt, auch fündig wird:

    Grob gesagt ist UTF8 die falsche Wahl. Um zum Ziel zu kommen ist "UTF8MB4" notwendig gewesen. Hierzu musste ich in der Konfigurationsdatei des Servers my.cnf folgende Anpassungen vornehmen:

    Code
    [client]
    default-character-set = utf8mb4
    
    [mysql]
    default-character-set = utf8mb4
    
    [mysqld]
    character-set-client-handshake = FALSE
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci

    Natürlich müssen dann noch die Datenbank, Tabelle(n) und Spalte(n) entsprechend angepasst werden. Dann sieht das Ergebnis so aus:

    Sowohl das Array, als auch die Konsole zeigen die identischen Daten und diese kommen auch korrekt in der Datenbank an.

    Soweit ich das beurteilen kann: Case closed!

    Vielen Dank für deine Hilfe Bitnugger !

  • Zeichensatz-Probleme beim Schreiben in MariaDB

    • robbytobi
    • 16. September 2021 um 10:07

    Erstmal Dank für die User-Properties. Das entsprechende Fragment ist erfolgreich eingebaut und stimmt mit dem Screenshot überein.

    Die Daten in der Datenbank hab ich sowohl mit PhpMyAdmin als auch mit DBeaver angeschaut. Wenn ich die Daten dort damit (mit beiden) versuchsweise mit den korrekten Zeichen überschreibe, dann erscheinen diese auch dort korrekt. Ich werd mal versuchen die Daten vor dem Absenden "doch" zu konvertieren...

  • Zeichensatz-Probleme beim Schreiben in MariaDB

    • robbytobi
    • 15. September 2021 um 21:26

    Ich habe nun folgenden Status:

    Soweit stimmt das. Ich konvertiere den Text vor der Konsolenausgabe und er erscheint richtig in der Konsole. Allerdings kommen in der DB nun wieder nur Fragezeichen an:

    Zwei Fragen: Wo kann man die Statusleiste unten denn so einstellen? Ich hab dort nur einen Eintrag. Den kann ich per Klick toggeln. Aber das Encoding ist nicht dabei? (Ich denke zwar, dass das stimmt, aber kann es leider nicht final bestätigen)

  • Zeichensatz-Probleme beim Schreiben in MariaDB

    • robbytobi
    • 14. September 2021 um 12:36

    Nachdem ich zuerst die SciTEUser.properties angepasst hatte ist noch gar nichts passiert. Die Zeichen wurden durch die berühmten Fragezeichen ersetzt.

    Eine erste Veränderung hat nun der Einsatz von _WinAPI_WideCharToMultiByte ergeben: Folgendes Array wird wie unten stehend an der Console ausgegeben und kommt dann auch so in der Datenbank an....

    Code
    Local $sUTFcontent[4][1]
    $sUTFcontent[0][0] ="Content"
    $sUTFcontent[1][0] ="облачные решения для любой отрасли"
    $sUTFcontent[2][0] ="業界に特化したモダン"
    $sUTFcontent[3][0] ="Loret ipsum äöüß"
    
    ;Consolen-Outout:
    ;INSERT INTO testcont (Content) VALUES ('облачные Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð»ÑŽÐ±Ð¾Ð¹ отраÑли')
    ;INSERT INTO testcont (Content) VALUES ('業界ã«ç‰¹åŒ–ã—ãŸãƒ¢ãƒ€ãƒ³')
    ;INSERT INTO testcont (Content) VALUES ('Loret ipsum äöüß')

    Ergo: Ich hab zwar noch nicht die richtige Quell/Ziel -Codepage, aber ich mutmaße, dass das, was ich an die Datenbank schicke mir richtig übertragen und auch von der Console entsprechend angezeigt wird. Also dafür schon mal einen kleinen Dank an dich! (nach zwei Wochen an diesem Thema ist das ein echter, erster Fortschritt!! :party: )

    Die Frage ist nun nur noch, wo das Problem liegen könnte? Wenn ich das Array in eine Datei schreibe und es mit Notepad öffne, dann zeigt er mir UTF8 an. Auch ohne, dass ich erst was konvertiere.

    Was mich irritiert: in der Beschreibung von _WinAPI_WideCharToMultiByte steht "...Converts a UTF-16 (wide character) string to a multibyte string...". Ist das Problem vielleicht, dass ich das falsche "Quellformat" habe?

  • Zeichensatz-Probleme beim Schreiben in MariaDB

    • robbytobi
    • 13. September 2021 um 19:20

    Vielleicht doch noch ein bisschen tiefer:

    Hier die Funktion zum Schreiben des Arrays. Diese Funktion baut aus den in der ersten Zeile enthaltenen Spaltennamen ein "Basisstatement" auf und schreibt dann Zeilenweise die Daten an die richtigen Stellen

    Code
    Func _Add2DArrayIntoDB($aArray, $sTable, $aServer)
        ;Einfügen eines 2D - Arrays in eine Tabelle.
        ;Gibt als Ergebnis ein 1D-Array mit dem Status (1 = ok/ 0 =failed) zurück
        If Ubound($aArray,0) <> 2 Then Exit                ;==> Abbruch: kein 2-D Array!!
        
        Local $aResult[UBound($aArray)]                    ;Leeres 1D-Return-Array
        $oConn = _SQLConnect($aServer[0],$aServer[1],1,$aServer[2],$aServer[3],$aServer[4],$aServer[5]) ;Server Connect
        
        ;Vorbereitung: Spaltennamen auswerten und Basisstatement (Header-Daten) vorbereiten
        Local $sColumnFieldsString = ""
        For $i = 0 To Ubound($aArray, $UBOUND_COLUMNS)-1
            $sColumnFieldsString &= $aArray[0][$i] & ", "
        Next
        $sColumnFieldsString = StringLeft($sColumnFieldsString,StringLen($sColumnFieldsString)-2)
         $sSQLBaseStatement = "INSERT INTO "& $sTable & " (" & $sColumnFieldsString&")" & " VALUES "
        ;Zeilendaten: Daten pro Zeile in einen String wandeln und zusammen mit dem Basisstatement einen gültigen SQL-Befehl bauen und an die DB senden
        For $i = 1 To Ubound($aArray,$UBOUND_ROWS)-1
            $sData = ""
            $sErrorInfo =""
            For $j = 0 To Ubound($aArray,$UBOUND_COLUMNS)-1
                $sData &= "'"&$aArray[$i][$j] & "', "
            Next
            $sData = StringLeft($sData,StringLen($sData)-2)
            $sData = "("&$sData&")"
            ConsoleWrite($sSQLBaseStatement&$sData&@CRLF)
            $iExpectedErrMode =1
            $oQueryResult = _SQLQuery($oConn, $sSQLBaseStatement&$sData)
            $iExpectedErrMode =0
            If $sErrorInfo <> "" Then
                $aResult[$i] = "0"
            else
                $aResult[$i] = "1"
            EndIf
        Next
    
        $sErrorInfo =""
        _SQLDisconnect($oConn)                                                                            ;Server Disconnect
        ;_ArrayDisplay($aResult)
        Return($aResult)
    EndFunc
    Alles anzeigen

    Ich übergebe hierbei die Verbindungsdaten des Servers als Array an eine entsprechend leicht modifizierte Funktion "_SQLConnect"

    Code
    Func _SQLConnect($sServer, $sDatabase, $fAuthMode = 0, $sUsername = "", $sPassword = "", $sDriver = "{SQL Server}" ,$sPort = 3306)
    ;ConsoleWrite("Serververbindung... ")
    Local $sTemp = StringMid($sDriver, 2, StringLen($sDriver) - 2)
    Local $sKey = "HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers", $sVal = RegRead($sKey, $sTemp)
    If @error or $sVal = "" Then Return SetError(2, 0, 0)
    ;ConsoleWrite($sTemp&": ")
    ;ConsoleWrite("sval:"& $sVal&@CRLF)
    
    
    $oConn = ObjCreate("ADODB.Connection")
    ;If  IsObj($oConn) Then ConsoleWrite("ADODB.Connection läuft..."&@CRLF)
    If NOT IsObj($oConn) Then Return SetError(3, 0, 0)
    
    
    If $fAuthMode Then $oConn.Open ("DRIVER=" & $sDriver & ";SERVER=" & $sServer & ";DATABASE=" & $sDatabase & ";UID=" & $sUsername & ";PWD=" & $sPassword & "; PORT=" & $sPort & ";")
    If NOT $fAuthMode Then $oConn.Open("DRIVER=" & $sDriver & ";SERVER=" & $sServer & ";DATABASE=" & $sDatabase)
    If @error Then Return SetError(1, 0, 0)
    
    
    Return $oConn
    EndFunc   ;==>_SQLConnect
    Alles anzeigen

    Das alles nur mal erwähnt, damit a) ihr wisst wie ich mich mit dem Server verbinde und (ansonsten erfolgreich) kommuniziere. Vielleicht hilft das ja jemand.

  • Servus vom Robbytobi

    • robbytobi
    • 13. September 2021 um 19:01

    Musashi: Wie du (deiner Signatur entnommen) ganz sicher weißt, kann man doch fliegen wenn man nach dem Stolpern das hinfallen einfach weglässt. Wer braucht da noch ein Fliewatüüt :rofl:

  • Servus vom Robbytobi

    • robbytobi
    • 13. September 2021 um 18:56

    Bitnugger: Ja, das wäre dann die Kehrseite: Mal schnell jemandem helfen der "noch weniger weiß". :D Aber in der Tat ist das Geben auch ein kleiner Hintergedanke. In Foren, in dem dies funktioniert. Und zu denen man passt.

  • Zeichensatz-Probleme beim Schreiben in MariaDB

    • robbytobi
    • 13. September 2021 um 18:51

    Hallo zusammen!

    Ich habe eine Datenbank erstellt, in die ich Textblöcke in unterschiedlichen Sprachen hineinschreiben möchte. Diese "Kopierarbeiten" (Insert) funktionieren wunderbar, so lange keine chinesischen oder russischen Texte geschrieben werden sollen. Diese werden dann als Fragezeichen übertragen.

    Nach nun etlichen Stunden des Recherchierens und Probierens gehen mir langsam die Ansätze aus. Außer, dass das Problem etwas mit den Eingestellten/ übertragenen Zeichensätzen zu tun hat (mutmaßlich) hab ich keine Ahnung was ich noch ausprobieren könnte (oder wo das Problem liegt).

    Anbei ein Code-Schnipsel, dass die Problematik umschreibt. (Bei Nachhaken gehe ich gerne tiefer)

    Code
    Local $sUTFcontent[4][1]
    $sUTFcontent[0][0] ="Content"
    $sUTFcontent[1][0] ="облачные решения для любой отрасли"
    $sUTFcontent[2][0] ="業界に特化したモダン"
    $sUTFcontent[3][0] ="Loret ipsum äöüß"
    
    _ArrayDisplay($sUTFcontent)
    
    Local $hFileOpen = FileOpen("UTF8.txt", $FO_OVERWRITE)
    FileWrite($hFileOpen, $sUTFcontent[1][0])
    FileClose($hFileOpen)
    
    _Add2DArrayIntoDB($sUTFcontent, "testcont", $aDBserver)   ;Funktion, die das Schreiben (Insert) eines Arrays in eine Tabelle übernimmt
    Alles anzeigen

    Ich habe zum Test ein kleines Array angelegt, in dem irgendwelche unterschiedlichen Contents drin sind.

    Dann lasse ich mir diese mit _ArrayDisplay anzeigen. -> das Ergebnis ist korrekt

    Ich schreibe einen der problematischen Texte in eine Textdatei. -> das Ergebnis ist korrekt

    Bis dahin scheint mir klar, dass mit dem Inhalt des Arrays soweit passen dürfte.

    Nun kommt es:

    in der Datenbank steht dann folgendes:

    Content

    ----------------------------------

    ???????? ??????? ??? ????? ???????

    ??????????

    Loret ipsum äöüß

    An der kleinen Schreib-Funktion von mir sollte es nicht liegen: Diese schreibt ansonsten alle meine Arrays zu meiner Zufriedenheit in meine Datenbanken ;)

    Also gibt es irgendwo ein Problem mit den verwendeten oder angenommenen Zeichensätzen.

    UTF8 als Basis scheint mir geeignet um alle meine Anforderungen abzudecken. Deshalb hab ich schon an den Einstellungen der Datenbank herumgeschraubt. Ein Blick in die Einstellungen der Datenbank:

    SHOW VARIABLES LIKE 'character_set\_%'

    character_set_clientutf8
    character_set_connectionutf8
    character_set_databaseutf8
    character_set_filesystembinary
    character_set_resultsutf8
    character_set_serverutf8
    character_set_systemutf8

    Wenn ich die Daten mit anderen Programmen (z.B. DBeaver oder aus PhpMyAdmin) in die Datenbank schreibe, dann klappt das alles.

    Ergo:

    Die Datenbank kann es.

    Das Array/Autoit kann es auch (eigentlich)

    ->irgendwo ist ein Problem beim Übertragen als "UTF8"

    Für alle Hinweise dankbar,

    Gruß Robbytobi

  • Servus vom Robbytobi

    • robbytobi
    • 13. September 2021 um 18:08

    "Griasd eich" aus dem schönen Bayern!

    Nachdem ich beruflich als auch privat schon so einiges mit AutoIt machen konnte/durfte/musste, wird es auch für mich mal Zeit am Forenleben teilzunehmen. Bislang hatte ich nur als passiver Leser Wissen aus den deutsch- und englischsprachigen Foren ergattern und aneignen können. Aber nach mehreren Jahren der Anwendung in unterschiedlichen Bereichen ist an der einen oder anderen Stelle das Wissen dann doch mal etwas dünn ...und dann braucht es eben den Austausch mit anderen.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™