Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ZEOS ZQuery liest Spalte mit Collation utf8_bin nicht richtig aus (https://www.delphipraxis.net/195688-zeos-zquery-liest-spalte-mit-collation-utf8_bin-nicht-richtig-aus.html)

Codehunter 21. Mär 2018 07:27

AW: ZEOS ZQuery liest Spalte mit Collation utf8_bin nicht richtig aus
 
Zitat:

Zitat von EgonHugeist (Beitrag 1396839)
Was ist damit? Zeos + MySQL mappt den enum('Y','N') zu ftBoolean. Das ist schon immer so, da MySQL keinen Boolean-Typen hat. Hast du andere Probleme mit dem Enums?

Ja. Das bezieht sich wieder auf die Tabelle mysql.user, worin es diverse _priv-Felder als ENUM('Y','N') gibt, die aber in meinem Fall (MariaDB 10) immer als AsString="Wahr" geliefert werden. Sowas kannte ich auch früher von UniDAC, wo der Boolean-Cast per Default nur bei ENUM('0','1') und nicht bei Unicode-Feldern funktionierte und alle anderen ENUMs immer "Wahr" (weil Inhalt <> "0") lieferten, bis man alternative Boolean-ENUMs konfiguriert hat. Irgendwann hat man das seitens Devart geändert und Y/N auch per Default als Boolean integriert. Ich habe mir aber angewöhnt, den Boolean-Cast generell abzuschalten und mit
Delphi-Quellcode:
if AsString = 'Y'
zu prüfen, weil es mehrmals nach einem Update des DBMS vorkam, dass das Casting nicht richtig funktionierte. Oder ich bin gleich ganz auf TINYINT(1) ausgewichen und habe auf
Delphi-Quellcode:
if AsInteger > 0
geprüft.

Wie gesagt, für mich ist ZEOS neu. Kann man denn da auch die Boolean-ENUMs konfigurieren/abschalten oder ist das Y/N hartcodiert?

Zitat:

Zitat von EgonHugeist (Beitrag 1396839)
Wegen der 7.3 + Zeithorizont. Nicht wirklich, schön wäre noch diesen Sommer. Soll heißen es wäre schön daß mal so einige damit loslegen, damit mehr Tests/Reports der Benutzer bekommen. Hinterher kritisieren kann jeder...

Das hier war ja nicht als Kritik an ZEOS gemeint. Ich habs halt so verwendet wie ich es von UniDAC gewohnt bin und es gab dabei Probleme. Konntest du eigentlich das Problem aus #7 nachstellen? Da kommen ja im Grunde zwei Sachen zusammen. Einerseits dass bei Gleichnamigkeit von Spalte und Tabelle die Zuordnung nicht klappt und andererseits das ohne serverseitiges Typecast ein utf8_bin mit AsString nicht richtig ausgelesen werden kann.

Davon abgesehen, ich kenne das genauso: Das höchste Lob das man als EDV'ler/Entwickler/Open-Source-Maintainer bekommen kann ist, nicht kritisiert zu werden. Insofern: ZEOS ist eine tolle Sache. Ich hätts mir vllt. eher mal anschauen sollen.

MichaelT 21. Mär 2018 08:24

AW: ZEOS ZQuery liest Spalte mit Collation utf8_bin nicht richtig aus
 
Ein Enum ist ein Aufzählung und nicht Boolean. Das hat sich seit 2014 nicht geändert:wink: (tinyint(1)). Der Bit Datentyp kommt noch hin.

Den Booleantyp muss die Datenbank können und die Interpretation von Devart ist verständlich, aber auch Devart hat das nicht ganz so freiwillig eingebaut (Interbase, Firebird haben ähnliche Ansinnen). Möglw. war es FIBPlus die damit begonnen haben oder IBOBjects im Umfeld von Interbase.

Die Enumumeration geht weiter. Es gibt mal die konkrete Ausprägung in Form eines Wertbereichs der fix festgelegt ist (enum in der Programmiersprache). Dabei handelt es sich um einen Spezialfall. In der gelebten Praxis ist eine Enumeration dynamisch erweiterbar und auf der Ebene im Programm gehaltene Metadaten angesiedelt.

Mal abseits der vielen Lösungen die eher im Umfeld der Anzeige rumkugeln eine mit einer Database Table für Firebird aus dem ZEOS Forum für Firefird.

Wahr oder Falsch sind was anders gelagert als die C Interpretation. Es gibt allein ein mathematischen Beweis, dass beide Varianten auf das selbe rauslaufen und damit Deckungsgleich sind. In C ist nur 'false' mit 0 definiert und not false ist true.

(section 7.16 / C99). Es gibt dann in der stdbool.h mal eine Definition über 0 und 1.



[QUOTE=Codehunter;1396845]
Zitat:

Zitat von EgonHugeist (Beitrag 1396839)
Was ist damit? Zeos + MySQL mappt den enum('Y','N') zu ftBoolean.


Codehunter 21. Mär 2018 11:49

AW: ZEOS ZQuery liest Spalte mit Collation utf8_bin nicht richtig aus
 
Zitat:

Zitat von MichaelT (Beitrag 1396852)
Ein Enum ist ein Aufzählung und nicht Boolean. Das hat sich seit 2014 nicht geändert:wink: (tinyint(1)). Der Bit Datentyp kommt noch hin.

Und wie spricht man den in Delphi an? Mit AsInteger soweit ich weiß ^^ Da kann ich auch gleich TINYINT nehmen, habe fast alle Vorteile von ENUM (außer der Bereichsgrenzen) abzüglich aller Nachteile von ENUM 8-)

Zitat:

Zitat von MichaelT (Beitrag 1396852)
Den Booleantyp muss die Datenbank können und die Interpretation von Devart ist verständlich, aber auch Devart hat das nicht ganz so freiwillig eingebaut (Interbase, Firebird haben ähnliche Ansinnen). Möglw. war es FIBPlus die damit begonnen haben oder IBOBjects im Umfeld von Interbase.

völlig richtig! IMHO fehlt Data.DB.TFieldType ein Datentyp für ENUM, quasi ein undefinierter Zustand. Das kann man dann weder ZEOS noch Devart wirklich vorwerfen dass sie gezwungen sind, irgendwelche Quasi-Standards zu übernehmen.

Zitat:

Zitat von MichaelT (Beitrag 1396852)
Wahr oder Falsch sind was anders gelagert als die C Interpretation. Es gibt allein ein mathematischen Beweis, dass beide Varianten auf das selbe rauslaufen und damit Deckungsgleich sind. In C ist nur 'false' mit 0 definiert und not false ist true.

Womit es eigentlich richtig wäre, wenn wie bei mir geschehen AsString immer zu "Wahr" auflöst, selbst wenn das Feld als ENUM('N','Y') definiert und mit "N" belegt ist. Devart hat eben genau das später konfigurierbar gemacht, weil die Kaffeesatzleserei in Quasistandards zu nichts führte :)

MichaelT 21. Mär 2018 18:20

AW: ZEOS ZQuery liest Spalte mit Collation utf8_bin nicht richtig aus
 
Bei MySQL hat der ENUM noch nicht mal eine Bedeutung. Der ist ein Array/Liste so ich mich recht erinnere.

Bei der Delphi DBCheckbox hinterlegst du ja den Wert für checked oder unchecked. Die Frage stellt sich eher beim Grid. Dort hast du auch die Events zum setzen.

Ich habe nochmal geschaut. Einen sauberen Weg wie man einen Boolean über SQL-Macros oder Mapping hinbekommt habe ich nicht gefunden.

Der FireDAC geht noch soweit als dass er Konstante auf 0 oder 1 resp. true oder false auf die Datenbank zurückübersetzt je nachdem ob die DB Boolean Datentypen unterstützt und damit solche Feldtypen.

Bei Interbase kannst du über Domänen arbeiten und der Typenbezeichner muss BOOL enthalten, Metadaten musst du die Query lesen lassen. Aber das hilft dir in der Regel auch nicht wirklich viel.

Doku.

Den ENUM selbst kannst du über eine LOOKUP Tabelle realisieren. Enums werden auch so gespeichert.



EgonHugeist 22. Mär 2018 07:45

AW: ZEOS ZQuery liest Spalte mit Collation utf8_bin nicht richtig aus
 
Hi,

fieldtype tinyint(1) fällt aus Leute, da spiel ich nicht mit. Ich will einen ShortInt/Byte Type sehen und benutzen, wenn ich das will.
Ich mach jetzt mal kurz wegen der MySQL Enums, da ich sonst in deutsch schreiben würde, was ich im Zeos-Forum mit meinem gebrochenem Englisch geschrieben, habe: http://zeoslib.sourceforge.net/viewt...p=93141#p93141
Hat sich fast Zeistgleich überschnitten.


Zitat:

Zitat von CodeHunter
Das hier war ja nicht als Kritik an ZEOS gemeint. Ich habs halt so verwendet wie ich es von UniDAC gewohnt bin und es gab dabei Probleme. Konntest du eigentlich das Problem aus #7 nachstellen? Da kommen ja im Grunde zwei Sachen zusammen. Einerseits dass bei Gleichnamigkeit von Spalte und Tabelle die Zuordnung nicht klappt und andererseits das ohne serverseitiges Typecast ein utf8_bin mit AsString nicht richtig ausgelesen werden kann.

Bitte, Cody, mir fehlt Zeit ... Was soll damit sein? Für mich ist das abgehakt. Hole dir bitte einen SnapShot direkt vom SVN, wenn du kein TortoiseSVN oder ähnliches verwendest:
gehe zu: https://sourceforge.net/p/zeoslib/co...s/testing-7.2/
und klicke auf den Download-SnapShot Button.

Sollte das Problem bestehen melde dich nochmal. Ein RC ist fix, er wurde einmal hochgeladen und wird nicht mehr geändert. Emba wirft auch nicht täglich neue Versionen von Delphi raus oder überschreibt die derzeitige, nur weil ein Feature/Bugfix gemacht wurde.

Gruß, Michael


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:05 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz