Neue Mysql-Funktion(en)

MAC OSX spezifisches Forum
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
babelfish
Beiträge: 57
Registriert: 08.07.2009 10:53

Neue Mysql-Funktion(en)

Beitrag von babelfish »

Hallo Pur'ler

Lange hab ich ohne Hilfe gearbeitet... aber jetzt stehe ich an.
Meine Suche ergab auch noch keine Hilfe.

Mein Problem:
Hab eine Kundenverwaltung (bin eigentlich Rauchfangkehrer (Schornsteinfeger) mit EDV-Wurzeln *g*) mit mySQL (bzw. seit kurzem MariaDB) und PureBasic unter OSX geschrieben.
Erst unter Windows - dann auf OSX - Früher mit ODBC - dann mit mysql.lib von http://hex0rs.coderbu.de (danke - mindestens ein Bier steht *g*)

Und nun unter 5.7 sollte die DB-Abfragen wieder mit Boardmitteln funktionieren.

Erste Tests... verliefen mit Fehlern... Dann mal eine Test.pb geschrieben um die neue Sache zu lernen - insbesondere für den Übergang zur 5.7 um beide Versionen aktiv zu halten (falls weitere Probleme auftauchen sollten):

Code: Alles auswählen

Debug #PB_Compiler_Version;

CompilerIf (#PB_Compiler_Version >= 570) 
  UseMySQLDatabase()
  If OpenDatabase(db, "host=xxx.xxx.xxx.xxx port=yyyy dbname=zzzz", "user", "password")
    Debug "Verbunden zu MySQL"
  Else
    Debug "Verbindung fehlgeschlagen: "+DatabaseError()
  EndIf
CompilerElse 
  XIncludeFile "mysql.pbi"
  UseMySQLDatabase()
  If OpenDatabase(db, "host=xxx.xxx.xxx.xxx port=yyyy dbname=zzzz", "user", "password", #PB_Database_MySQL)
    Debug "Verbunden zu MySQL"
  Else
    Debug "Verbindung fehlgeschlagen: "+DatabaseError()
  EndIf
CompilerEndIf

  
 Debug Str(#PB_Compiler_Version)

  
  query$ = "SELECT `Brennstoff` FROM `Feuerstaetten2014`  group by `Brennstoff`  ORDER BY `Brennstoff` ASC"
  If DatabaseQuery(db, query$)
    While NextDatabaseRow(db)
      Brennstoff$    = GetDatabaseString(db,0)
      If (Brennstoff$ <> "")
        Debug "original:"+Brennstoff$
; Meine Versuche Umlaute wieder lesen zu können:
        Debug "URLencode UTF8:"+URLEncoder(Brennstoff$, #PB_UTF8)
        Debug "URLencode ASCII:"+URLEncoder(Brennstoff$, #PB_Ascii)
        
        *Text = UTF8(Brennstoff$)
        Encoded$ = Base64Encoder(*Text, MemorySize(*Text))
        *DecodedBuffer = AllocateMemory(1024)
        Base64Decoder(Encoded$, *DecodedBuffer, 1024)
        Debug " UTF8:"+ PeekS(*DecodedBuffer, -1, #PB_UTF8)

      EndIf
      Debug "--------------------------------------------"
    Wend
  Else
    MessageRequester("Datenbankfehler","Startwerte "+Chr(13)+query$)
  EndIf
  
  CloseDatabase (db)
Meine, leider Fehlerhafte, Ausgabe ist folgende (Nur ein Ausschnitt):

Code: Alles auswählen

570
Verbunden zu MySQL
570
--------------------------------------------
--------------------------------------------
original:HEL - Ofenhei
URLencode UTF8:HEL%20-%20Ofenhei
URLencode ASCII:HEL%20-%20Ofenhei
 UTF8:HEL - Ofenhei
bzw. mit altem Compiler -> so wäre es korrekt...

Code: Alles auswählen

561
Verbunden zu MySQL
561
--------------------------------------------
--------------------------------------------
original:HEL - Ofenheizöl
URLencode UTF8:HEL%20-%20Ofenheiz%C3%B6l
URLencode ASCII:HEL%20-%20Ofenheiz%F6l
 UTF8:HEL - Ofenheizöl
Datenbank hatte ich standardmäßig auf Latin1 und habs auch auf UTF8 konvertiert (natürlich nur eine Kopie davon)
Erst dachte ich das die interne Verarbeitung Probleme macht... aber anscheinend kommen die Daten schon falsch bzw. vielleicht sogar abgeschnitten rüber...

Bitte um Hilfe... was kann ich noch tun, probieren oder ändern.
Hab ich die Lösung nur noch nicht richtig gesucht?

Grüße

Robert
Hauptsächlich Purebasic für OSX
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Neue Mysql-Funktion(en)

Beitrag von ccode_new »

Hallo babelfish!
Brennstoff$ = GetDatabaseString(db,0)
Der Fehler tritt ja schon hier beim Auslesen auf.
Da bringt irgendeine andere Auslesemethode mit selbigen Bezug (auf Brennstoff$) ja auch nichts.

???


Du könntes jetzt mal folgendes Ausprobieren:

Code: Alles auswählen

feldgroesse = DatabaseColumnSize(db, 0)
daten = AllocateMemory(feldgroesse)
GetDatabaseBlob(db, 0, @daten, feldgroesse)
Debug PeekS(@daten, feldgroesse, #PB_UTF8) ;Dein Brennstoff$ - String
Was kommt dabei raus ?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
babelfish
Beiträge: 57
Registriert: 08.07.2009 10:53

Re: Neue Mysql-Funktion(en)

Beitrag von babelfish »

ccode_new hat geschrieben:
Was kommt dabei raus ?
Danke - Habs eingebaut:

Code: Alles auswählen

...
        Debug " UTF8:"+ PeekS(*DecodedBuffer, -1, #PB_UTF8)
        
; Mit Hilfe aus dem Forum:
        feldgroesse = DatabaseColumnSize(db, 0)
        daten = AllocateMemory(feldgroesse)
        GetDatabaseBlob(db, 0, @daten, feldgroesse)
        Debug "Mit Hile aus dem Forum:"+PeekS(@daten, feldgroesse, #PB_UTF8) ;Dein Brennstoff$ - String
        
        
      EndIf
      Debug "--------------------------------------------"
...
Ich finde es wird immer Mysteriöser:
Sobald ein Umlaut dabei ist kommt gar nichts mehr... sonst alles normal.
Und unter der MYSQL.lib gehts gar nicht da dort keine Blob's unterstützt werden.

Code: Alles auswählen

--------------------------------------------
original:Hackgut
URLencode UTF8:Hackgut
URLencode ASCII:Hackgut
 UTF8:Hackgut
Mit Hile aus dem Forum:Hackgut
--------------------------------------------
original:HEL
URLencode UTF8:HEL
URLencode ASCII:HEL
 UTF8:HEL
Mit Hile aus dem Forum:HEL
--------------------------------------------
original:HEL - Ofenhei
URLencode UTF8:HEL%20-%20Ofenhei
URLencode ASCII:HEL%20-%20Ofenhei
 UTF8:HEL - Ofenhei
Mit Hile aus dem Forum:
--------------------------------------------
Hauptsächlich Purebasic für OSX
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Neue Mysql-Funktion(en)

Beitrag von ccode_new »

Hallo Robert,

hast du dein Problem schon behoben bekommen ?

Wie es sich unter MacOS verhält weiß ich nicht, aber unter Windows/Linux funktioniert eine korrekte UTF8-Stringrückgabe.

Unter MySQL hast du auch das CHARSET auf utf8 eingestellt ?

(Standard: 3 Byte - Länge) ?
Bei mir 4 Byte.
## UTF 8 Settings
#init-connect=\'SET NAMES utf8\'
#collation_server=utf8_unicode_ci
#character_set_server=utf8
Hast du mal "utf8mb4" probiert ? (4 Byte Länge) Einfach mal als Test.

Welche Länge wird bei dir als Feldgröße zurückgegeben ?

Welcher Datentyp wird verwendet ?

CHAR, VARCHAR, TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Neue Mysql-Funktion(en)

Beitrag von mk-soft »

Ich habe hier einen NAS mit MySQL-Server an laufen (LinkStation).

- Server: Localhost via UNIX socket
- Server Version: 5.0.70-log
- Protokoll-Version: 10
- MySQL-Zeichensatz: UTF-8 Unicode (utf8)

Hier brauche ich nichts umwandelt.
Alle Strings funktionieren auch mit Sonderzeichen...

Windows, Linux, MacOS alles ok hier mit der libmariadb.* (dll/so/dylib) .

Muss also wo anders dran liegen...

P.S. Unter MacOS funktioniert ODBC nicht

Habe bereits ein Bugreport im englischen Forum geschrieben.

Der Fehler ist das PB versucht mit der Größe von Type wchar_t = 2 byte mit iODBC zu arbeiten
Aber unter MacOS ist aber iODBC der Type wchar_t = 4 byte gross...

Blöde Macke. Unter Linux gab es keine Probleme mit wchar_t = 2 byte...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
babelfish
Beiträge: 57
Registriert: 08.07.2009 10:53

Re: Neue Mysql-Funktion(en)

Beitrag von babelfish »

Danke erstmal für eure Antworten.
Unerwartet gehts grad wieder richtig zu mit Terminen usw.
D.h. ich hab bisher noch keine Zeit gefunden an dem Problem weiterzuarbeiten.

Nur gut das ich in dem Fall ja nur was verbessern möchte und somit keinen Zeitdruck habe.

Ich melde mich verlässlich - kann aber etwas dauern :)
Hauptsächlich Purebasic für OSX
babelfish
Beiträge: 57
Registriert: 08.07.2009 10:53

Re: Neue Mysql-Funktion(en)

Beitrag von babelfish »

Lag lang hast gedauert..
Ich weiss jetzt gar nicht ob ihr vielleicht wo anders weiter diskutiert habt oder so...

Aber hier hab ich (m)eine Lösung für mein Problem.

Code: Alles auswählen

UseMySQLDatabase("/usr/local/mysql-8.0.16-macos10.14-x86_64/lib/libmysqlclient.21.dylib")
Und alles ist gut.
Hauptsächlich Purebasic für OSX
babelfish
Beiträge: 57
Registriert: 08.07.2009 10:53

Re: Neue Mysql-Funktion(en)

Beitrag von babelfish »

Wieder länger nichts getan und jetzt wollt ich mit meinem neuen M1-MacbookPro die Sache neu angehen.

Optimierung war das Stichwort - gleich mal ohne jegliche MYSQL-Connector-Installation soll es laufen.
Und wieder das alte Problem - keine Umlaute sondern abgeschnittene Strings.

Doc Google zur Hand genommen und siehe da...
Da hat doch noch jemand das Problem... und eine Lösung erhalten.

Siehe:
http://forums.purebasic.com/german/view ... =3&t=31888

Die Lösung:
Nach OPENDATABASE(....

Code: Alles auswählen

DatabaseUpdate(0,"SET NAMES utf8")


Und alles ist gut - erste Tests ergaben das perfekte Ergebnis.

Jetzt kann "Erledigt"-Status drauf.
Hauptsächlich Purebasic für OSX
Antworten