Seite 1 von 1

MySQL Type "L" [erledigt]

Verfasst: Mo, 22. Sep 2014 22:40
von AUGE_OHR
hi,

ich finde nicht das Gegenstück wobei ich nach BOOL gesucht habe.

nun habe ich das in Hectors Code gefunden ... aber was ist MYSQL_TINY_TYPE ?

Code: Alles auswählen

FUNCTION FieldType(nNum)
local cTypeXbase := "U"

   if nNum >=0
      do case
         case nNum == MYSQL_TINY_TYPE
              cTypeXbase := "L"

         case nNum == MYSQL_SHORT_TYPE      .OR.;
              nNum == MYSQL_TINY_TYPE       .OR.;
              ... 
              nNum == MYSQL_INT24_TYPE
              cTypeXbase := "N"
wenn ich z.b.

Code: Alles auswählen

`xxxx` tinyint(1) NOT NULL default '0', 
wäre es ein numerischer Wert (0/1)

Re: MySQL Type "L"

Verfasst: Di, 23. Sep 2014 4:34
von georg
Hallo, Jimmy -


MySQL bildet BOOL als TinyInt ab. 0 = ist falsch, alles andere wahr.

(Habe "0" ergänzt, war beim morgendlichen Tippen wohl nicht fest genug gedrückt worden, die 0-Taste.)

Re: MySQL Type "L"

Verfasst: Di, 23. Sep 2014 5:21
von AUGE_OHR
georg hat geschrieben:MySQL bildet BOOL als TinyInt ab. = ist falsch, alles andere wahr.
OK verstanden.
Dann müsste man auch die FUNCTION TipoField(nType,nLen,nDec)

Code: Alles auswählen

       case nType = "L"
//j         lResp := "CHAR(1)"
            lResp := "tinyint(1) NOT NULL default '0'"
ändern.

Re: MySQL Type "L"

Verfasst: Di, 23. Sep 2014 7:19
von georg
Hallo, Jimmy -


machen wir es doch mal an einem Beispiel klar:

Code: Alles auswählen

create table logval (was char(32), logisch boolean);
Was macht MySQL mit dem Feldtyp "boolean"?

Code: Alles auswählen

mysql> describe logval;
+---------+------------+------+-----+---------+-------+
| Field   | Type       | Null | Key | Default | Extra |
+---------+------------+------+-----+---------+-------+
| was     | char(32)   | YES  |     | NULL    |       |
| logisch | tinyint(1) | YES  |     | NULL    |       |
+---------+------------+------+-----+---------+-------+
2 rows in set (0.02 sec)
MySQL macht tinyint(1) draus. Jetzt fügen wir mal ein paar Sätze ein:

Code: Alles auswählen

mysql> insert into logval values('Null', 0), ('Eins', 1), ('zwei', -1);
Query OK, 3 rows affected (0.04 sec)
Records: 3  Duplicates: 0  Warnings: 0
Was ist drin?

Code: Alles auswählen

mysql> select * from logval;
+------+---------+
| was  | logisch |
+------+---------+
| Null |       0 |
| Eins |       1 |
| zwei |      -1 |
+------+---------+
3 rows in set (0.02 sec)
Und jetzt wollen wir die Sätze haben, bei denen das Feld logisch WAHR ist:

Code: Alles auswählen

mysql> select * from logval where logisch;
+------+---------+
| was  | logisch |
+------+---------+
| Eins |       1 |
| zwei |      -1 |
+------+---------+
2 rows in set (0.00 sec)
So ist das (zumindest) in MySQL implementiert.

Soweit ich das nachvollziehen konnte, ist die Änderung (numerische Felder werden bei Wert 0 als FALSCH, und bei allen anderen Werten als WAHR) seit MySQL Version 5.5 implementiert.

Ach, übrigens, es wäre immer gut, wenn Du angibst, auf welche Version von Hector's Klassen Du Dich beziehst ...

Dann denke ich, dass Du zu sehr an alten Zöpfen hängst. :confused2: Die TipoField() Funktion wird m.E. nur dann verwendet, wenn Du eine Tabelle mittels einer DBF-Struktur erstellen willst. Damit bist Du aber auf die DBF-typischen Felder beschränkt, kannst also z.B. keine ENUMs oder TIMESTAMP Feldtypen verwenden.

Ich nie über einen CREATE TABLE mittels einer dbStruct nachgedacht, sondern direkt den CREATE TABLE eingesetzt, da dieser Befehl mir auch die Möglichkeit gibt, direkt PRIMARY KEY etc. zu definieren, also in einem Aufwasch.

Re: MySQL Type "L"

Verfasst: Di, 23. Sep 2014 20:45
von AUGE_OHR
georg hat geschrieben:machen wir es doch mal an einem Beispiel klar:
JA ... jetzt ist es klar, Danke.
georg hat geschrieben:Ach, übrigens, es wäre immer gut, wenn Du angibst, auf welche Version von Hector's Klassen Du Dich beziehst ...
vermutlich die erste Version die Hector veröffentlicht hat.
ich habe nun den Source, mit WinDiff, verglichen und festgestellt das deine "lates" Version wohl die aktuellste ist.
georg hat geschrieben:Dann denke ich, dass Du zu sehr an alten Zöpfen hängst. :confused2: Die TipoField() Funktion wird m.E. nur dann verwendet, wenn Du eine Tabelle mittels einer DBF-Struktur erstellen willst. Damit bist Du aber auf die DBF-typischen Felder beschränkt, kannst also z.B. keine ENUMs oder TIMESTAMP Feldtypen verwenden.
JA ... ist klar.
Das ich die DBF importiere beschränkt mich zwar im ersten Schritt aber damit habe ich dann zunächst einmal bekannte Daten zum spielen.
georg hat geschrieben:Ich nie über einen CREATE TABLE mittels einer dbStruct nachgedacht, sondern direkt den CREATE TABLE eingesetzt, da dieser Befehl mir auch die Möglichkeit gibt, direkt PRIMARY KEY etc. zu definieren, also in einem Aufwasch.
für den PRIMARY KEY gibt es doch die Method CreatePrimaryKey( cTable, aCol ) in deiner Class MySQL ;)

ich habe TEST5.PRG von Hector gesehen und mich gefragt warum er nicht o:CreateTable(cTable,aStruct,cType) verwendet hat

Code: Alles auswählen

   // ? 'create table  form Structure',
   //    oCon:CreateTable( cTable,aStruct,cType)

   // type function type sql
      ? 'create table  form Type Sql',
         cSql := creatable()

         if oCon:RealQuery( cSql ) == 0
            msgbox('error Create')
         endif
...

Static function creatable()
Local cInst
        cInst = "CREATE TABLE IF NOT EXISTS `addressebook` ("
        cInst +=  "`AKey` int(11) NOT NULL auto_increment, "
        cInst += "`FName` varchar(15) NOT NULL default '', "
        cInst += "`LName` varchar(15) NOT NULL default '', "
        cInst += "`Address` varchar(25) NOT NULL default '', "
        cInst += "`City` varchar(18) NOT NULL default '', "
        cInst += "`State` varchar(2) NOT NULL default '', "
        cInst += "`Zip` varchar(5) NOT NULL default '', "
        cInst += "`Picture` longblob NULL default NULL, "
        cInst += "PRIMARY KEY  (`AKey`), "
        cInst += "KEY `Name` (`FName`,`LName`), "
        cInst += "KEY `City` (`City`), "
        cInst += "KEY `State` (`State`) "
        cInst += ") TYPE=MyISAM"
return cInst
sondern explizit "CREATE TABLE ..." ... hm :-k
nun hat Hector in der Table ein FIELD Type "longblob" vorgesehen aber mit solchen Type kommt der Rest der Class (noch) nicht klar :-"

ich arbeite mich z.Z. durch euren MySQL Code und vergleiche es gegen meinen PostgreSQL Code um zu sehen wo Unterschiede auftreten die ich anpassen muss.
die Idee war nun die Änderungen für MySQL in PGU einzubauen so das ich wahlweise PostgreSQL oder MySQL ansprechen kann.
damit hätte ich dann zum Schluss die Bausteine die ich benötige um eine Xbase++ Application mit native MySQL und/oder PostgreSQL zu betreiben.

Re: MySQL Type "L" [erledigt]

Verfasst: Mi, 24. Sep 2014 7:02
von georg
Hallo, Jimmy -


die Klasse ist von Hector, nicht von mir.

Ich habe ein paar Ergänzungen eingebaut, aber den Rest belassen, wie er ist. Dazu gehört auch eine Methode :CreatePrimaryKey().

Mein Eindruck ist - wenn ich jetzt Einblick in die Anfänge des Projektes bekomme - das Hector sehr stark nachgebessert hat und dabei (wohl auch um eigene Projekte kompatibel zu erhalten) bestimmte Methoden belassen hat.

Ich habe vor einiger Zeit auch ein Konvertierungsprogramm geschrieben, das liest die DBF-Struktur aus und erzeugt direkt die entsprechende CREATE TABLE Anweisung und übernimmt den Import.

Inzwischen erinnert in den meisten meiner Programmen nur noch die leere DBESys() dran, dass das Programm auch mit DBF-Datein könnte ...