WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Datentyp bei SQL Abfrage vorgeben

 

Kraeusi
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 09.02.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2016, 17:34     Titel: Datentyp bei SQL Abfrage vorgeben
  Antworten mit Zitat      
Hallo,

ich habe ein kleines Problem und komme nicht mehr weiter, vielleicht könnt ihr mir einen Denkanstoß geben Smile

Mein Problem ist folgendes:
Ich habe in einer Datenbank eine Spalte, dessen Wert ich abfragen möchte. Der Spaltentyp ist Image. Als Inhalt ist aber ein String gespeichert, im Hex-Format. Dieser String ist ca. 17000 Zeichen lang.

Nun Frage ich diesen Wert normal ab und erhalte auch ein Ergebnis. Da Matlab aber weder HEX noch Image erkennt, formatiert er mir den Wert zu int8 um, wodurch das Resultat nur noch 8500 Zeichen lang ist. Dabei werden alle Hexwerte weitestgehend umgerechnet.

Ich wollte nun mir die Werte wieder zurück in das HEX-Format holen (brauche ich für die weitere Verarbeitung)
Code:
Data = cell2mat(cellstr(dec2hex(unicode2native(char(cell2mat(curs(1).Data).')))).');


Das Funktioniert soweit ganz gut, aber nicht zu 100%. Da bei der Abfrage auch auf einmal negative Werte (-1) auftauchen, werden diese dementsprechend nicht richtig wieder zurück gewandelt.

Meine Fragen an euch wären nun:
- Kann ich Matlab zwingen, die Daten beim Abfragen nicht als int8 zu speichern sondern direkt als String?
- Warum macht Matlab aus Bereichen wie FFFFFFFF den Wert -1? Dementsprechend habe ich dann Probleme beim zurück wandeln meiner Daten (Formel oben) und erhalte nur 0, was jedoch falsch ist.

Danke und Gruß
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 14.02.2016, 19:17     Titel: Re: Datentyp bei SQL Abfrage vorgeben
  Antworten mit Zitat      
Hallo Kraeusi,

Zitat:
- Kann ich Matlab zwingen, die Daten beim Abfragen nicht als int8 zu speichern sondern direkt als String?

Bitte poste den Befehl, mit dem Du die Daten bisher importierst.

Zitat:
- Warum macht Matlab aus Bereichen wie FFFFFFFF den Wert -1? Dementsprechend habe ich dann Probleme beim zurück wandeln meiner Daten (Formel oben) und erhalte nur 0, was jedoch falsch ist.

Wenn man 'FF' in eine Dezimalzahl umwandelt, ist das entweder 255 als UINT8 oder eben -1, wenn es in ein INT8 umgewandelt wird. Wieso die Daten in INT8 umgewandelt werden, wird erst klar, wenn Du den Befehl zeigst, bei dem das geschieht.
Was bedeutet genau der "Spalten-Typ Image"? Wie wird dies intern gespeichert? Was heißt "Matlab erkennt kein HEX"? Woraus schließt Du das?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Kraeusi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 09.02.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2016, 19:56     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke für deine Antwort. Smile

Der Befehl steht bereits oben, jedoch ist es vielleicht etwas unübersichtlich in einer Wurst hingeschrieben.. Confused

Code:
Data = cell2mat(cellstr(dec2hex(unicode2native(char(cell2mat(curs(1).Data).')))).');


- Datenabfrage ->

Code:
cell2mat(curs(1).Data).';


Mit Spalten-Typ Image meine ich folgendes. Bei SQL, MySQL, MSSQL, .., wird jeder Spalte ein Typ zugewiesen, zum Beispiel Integer, Varchar, Char, .... . In diesem Fall ist es Image. Ich habe darauf leider keinen Einfluss, da es von einem bestehenden System so bereitgestellt wird, von dem ich Daten abrufe.

Danke und Gruß,
Kraeusi
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.02.2016, 20:42     Titel:
  Antworten mit Zitat      
Hallo,

der entscheidende Punkt ist, wie curs(1) bestimmt wird.
Das ist auch weiterhin unklar.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Kraeusi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 09.02.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2016, 20:54     Titel:
  Antworten mit Zitat      
Ok, nun weiß ich was ihr meint, sry Sad

Code:
sqlquery= 'SELECT RcpBody FROM X WHERE Y=123';
curs = fetch(exec(conn, sqlquery));
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.02.2016, 12:56     Titel:
  Antworten mit Zitat      
Hallo Kraeusi,

Okay. Was bekommst Du dann für:
Code:
class(curs(1).Data)

?

Diese Umwandlung gruselt mich:
Code:
cell2mat(cellstr(dec2hex(unicode2native(char(cell2mat(curs(1).Data).')))).')
Ich bin sicher, dass das direkter gehen muss.
Wie wäre es mit: http://www.mathworks.com/help/datab.....eve-image-data-types.html ?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Kraeusi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 09.02.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.02.2016, 14:56     Titel:
  Antworten mit Zitat      
Hallo Jan,

bei

Code:
class(curs(1).Data)


erhalte ich 'cell'.

Der Link ist zwar gut, aber das Problem wird das gleiche bleiben, da er immer alles als int8 abspeichert.

Als alternative hatte ich mir überlegt, den Wert -1 zu 255 umzuwandeln. Wenn ich nun -1 oder -128 mittels uint32(x) versuche, erhalte ich jedoch nur 0.

Danke und Gruß,
Kraeusi
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.02.2016, 16:31     Titel:
  Antworten mit Zitat      
Hallo Kraeusi,

Okay. Nun der nächste Schritt:
Code:
size(curs(1).Data)
class(curs(1).Data{1})

Wenn Du für die Images UINT8 brauchst, wird wohl typecast der richtige Befehl sein. Ich rate mal, ohne auf Deine Antwort auf den oben gezeigten Code zu warten:
Code:
image = typecast(curs(1).Data{1}, 'uint8');

Das könnte aber noch an den Dimensionen scheitern.

Wie hast Du das Bild denn in der Datenbank eingefügt?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Kraeusi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 09.02.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2016, 17:49     Titel:
  Antworten mit Zitat      
Hallo,

bei
Code:
size(curs(1).Data)
ist das Ergebnis [1 1]

bei
Code:
class(curs(1).Data{1})
ist das Ergebnis 'int8'

Bei
Code:
image = typecast(curs(1).Data{1}, 'uint8');
erhalte ich weiterhin den bereits umgewandelten string, jedoch mit keinen negativen zahlen mehr. Jetzt muss ich wohl wie zuvor den Inhalt wieder zu Hex umwandeln Smile

Als alternative hatte ich jetzt versucht mit
Code:
data = int16(data)
mehr Platz zu schaffen. So konnte ich dann in einer for schleife überprüfen ob ein negativer Wert vorkommt. Wenn ja, habe ich diesen neu mit 256 -den Wert neu berechnen. So kannte ich dann auch den realen Wert wieder mittels Hex-Code herstellen. Aber das war def. nicht die beste Lösung.

Der Spalten typ ist zwar Image, aber es ist kein Bild in der Datenbank. Es handelt sich um einen Hex-Byte String. Ich gehe davon aus, dass der Hersteller der sich das Konzept ausgedacht hatte, bei Text nicht genügt platz hatte und es deshalb als Typ Image speichert. Ändern kann ich das leider nicht Sad

Danke und Gruß,
Tobias
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 17.02.2016, 11:52     Titel:
  Antworten mit Zitat      
Hallo Kraeusi,

Zitat:
Bei
Code:
image = typecast(curs(1).Data{1}, 'uint8');
erhalte ich weiterhin den bereits umgewandelten string, jedoch mit keinen negativen zahlen mehr. Jetzt muss ich wohl wie zuvor den Inhalt wieder zu Hex umwandeln :)

"String" bedeutet CHAR-Vektor. Mit typecast erhältst Du einen UINT8-Vektor, der das gleiche Bit-Muster hat wie die Original-Daten. Mit uint16() zu casten verändert dagegen die Werte und ich sehe nicht, wozu das nützlich sein soll. Es gibt keinen Grund "mehr Platz" zu schaffen, denn Platzmangel ist ja gar nicht das Problem.
Man braucht keine FOR-Schleife um negative Zahlen zu finden:
Code:

Statt
Code:
ist eine Umwandlung mit typecast genau das, was Du benötigst.
Wieso möchtest Du daraus einen HEX-String machen? Das scheint mir ein überflüssiger Schritt zu sein.

Zitat:
Der Spalten typ ist zwar Image, aber es ist kein Bild in der Datenbank. Es handelt sich um einen Hex-Byte String.

Wieso glaubst Du, dass es ein Hex-Byte-String ist? Das halt ich für sehr unwahrscheinlich, denn Hex-codierte Daten belegen nur 4 Bits pro Byte, so dass dann die Hälfte des Speichers verschwendet wäre. Ich denke, dass die Daten als Bytes gespeichert werden, und dank typecast spielt es keine Rolle, ob sie INT8 oder UINT8-Format haben.

Images werden üblicherweise binär gespeichert. Man kann z.B. ein JPEG-File auf die Platte schreiben und danach als Byte-Folge in der Datenbank speichern. Die Byte-Folge muss dann hinterher zur Darstellung des Bildes wieder dekodiert werden. Es könnte aber auch ein PNG-Image sein, oder die RGB-Werte als [X,Y,3] matrix als UINT8 oder im DOUBLE-Format. Darum ist es wichtig zu wissen, wie das Bild abgespeichert wurde. Dazu müsstest Du entweder Code haben oder aber eine entsprechende Dokumentation.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Kraeusi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 09.02.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.02.2016, 10:52     Titel:
  Antworten mit Zitat      
Hallo

ich habe endlich die Zeit gefunden, den mittels Typecast rücktransformierten charvektor mit dem original aus der Datenbank zu vergleichen. Es existieren keine Unterschiede, womit ich das Problem dank deiner Hilfe beseitigen konnte Smile

Noch kurz zu deiner Frage, warum ich es im Hex Format benötige. Es sind Daten einer Produktionsanlage, welche im Hexformat auf der Anlage selbst oder in einer Datenbank gespeichert sind. Da ich mittels der FTP Funktion in Matlab (per Filezilla gehts, aber das ist ein anders Thema) nicht an die Daten herankomme, muss ich die Daten aus einer MSSQL Datenbank abfragen.

Ich habe einige Daten in diesem Char-Vektor enthalten welche ich auslesen und weiter verarbeiten möchte. Dabei handelt es sich einerseits um Text, welchen ich mittels einer ASCII Umwandlung erhalte und um bestimmte Zahlen. Diese Zahlen errechne ich mir allerdings über 4 Bytes. Du wirst dich sicherlich Fragen warum ich es so umständlich mache. Smile Der Grund hierfür liegt darin, dass es im Manual des Herstellers so definiert ist. Er speichert die Informationen eben so ab und ich muss mich an seine Struktur halten um an meine Daten heran zu kommen. Es ist defakto kein Bild was in der MSSQL Datenbank gespeichert ist. Smile

Danke noch mal für deine Hilfe Smile

LG
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.