MySQL Json String in MySQL einfügen.

XHann3sX

Aktives Mitglied
Hallo,

ich wollte heute etwas an einem Programm schreiben und müsste hierzeu einen JSONArray als JSON String in eine MySQL schreiben, da MySQL anscheinend JSON unterstützt dachte ich, das das gehen würde. Nun habe ich eine
Java:
    Connection connection;
connection = DriverManager.getConnection(xxx);
connection.createStatement().execute("INSERT INTO xxx(json_String) VALUES("+json+")");

Nunja jetzt schmeißt ehr mir einen Syntax-Fehler im JSON-String raus, da ich denke er meint dass die Kommas die in diesem JSON-String vorhanden sind als einzelne Werte ansieht , kann das sein ? Kann ich ein SQL Statement noch anders ausführen ?

Hannes
 

Tobse

Top Contributor
Benutze PreparedStatements. Undzwar immer! Wenn du Queries so ausführst, wie oben beschrieben, hast du eine klaffende Sicherheitslücke. Was wäre, wenn jemand in die Variable json diesen String hinein bekäme?
Code:
'{}'); DROP TABLE users;#
Setz es mal ein und schau was aus deinem harmlosen INSERT geworden ist ;)

Das nennt sich dann eine SQL Injection. Etliche der berühmtesten Hacks wurden über derartige Lücken ausgeführt.

----
Prepared Statements beheben dieses Problem. Siehe hier die offizielle Doku für Java (Prepared Statements funktionieren mit allen möglichen Programmiersprachen).

----
JSON ist am Ende auch nur ein String; du kannst JSON in jede VARCHAR oder TEXT Spalte schreiben, ist ja nur Text. Da bekommst du aber keine zusätzlichen Features; die bekommt man erst mit dem JSON Datentyp.
 

XHann3sX

Aktives Mitglied
Naja ich habe ein Array an Objekten, die alle unterschiedlich aufgebaut sind also Attribute haben , die nicht jedes andere hat, und auch ist die Zahl der Objekte nicht immer festgelegt, da kann ich dann einfach diese als JSON serialisieren und bei Bedarf deserialiesieren .
Es gibt ja auch Datenbanken, wie MongoDB , die ausschließlich auf JSON ähnlichen Einträgen basieren, gefällt mir persönlich auch besser, vlt auch nur weil ich sie das letzte Jahr über nur benutzt habe :D
 

Thallius

Top Contributor
Also ich finde Datenbanken nur dann sinnvoll wenn die Datenbank selber mir hilft die Daten zu finden und zu lesen die ich brauche. Wenn die Datenbank die Daten selber nicht kennt ist das nicht Möglich. Ich benutze die Datenbank dann also nur als Speichermedium. Das birgt gegenüber einer Textdatei dann aber keinen Vorteil mehr.

Guss

Claus
 

XHann3sX

Aktives Mitglied
Deswegen muss ich ja nicht nur eine JSON speichern, da kommen noch diverse ID von Benutzern eine allgemeine ID Timestamp etc , da fällt vorallem Macher das rausqueryen leichter :D
 

Tobse

Top Contributor
@Thallius genau das ist ja der Trick beim JSON Support von MySQL:

Code:
# von https://dev.mysql.com/doc/refman/5.7/en/json.html
mysql> SELECT JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name');
+---------------------------------------------------------+
| JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name') |
+---------------------------------------------------------+
| "Aztalan"                                               |
+---------------------------------------------------------+

Ich bin auch ein Freund der Normalisierung. Aber Normalisierte Daten wollen auch von einem Datenformat zu einem anderen migriert werden. Ich habe den JSON-Datentyp neulich in diesem Szenario verwendet: die Anwendung ist ein Front-End für eine Backend-Schnittstelle, die der Kunde bei sich pflegt und bereitstellt. An diese Schnittstelle kann man komplexe Anfragen senden und erhält eine komplexe Antwort. Für eine Historie der gestellten Anfragen werden die Antworten als JSON abgelegt. Die müssen nie bis selten durchsucht werden; gleichzeitig hält es aber den Aufwand bei einer Änderung der Datenstruktur in der Antwort gering, weil das Front-End nicht die komplette Anfragehistorie migrieren muss (was ggf. auch garnicht ginge, wenn. z.B. Felder dazukommen).
 

JuKu

Top Contributor
Normalisierung ist meist sehr unperformant.
Aber für den Thread Ersteller wäre eine NoSQL-Datenbank viel sinnvoller, als eine relationale Datenbank mit fester Struktur.
Deine Daten haben eben keine feste Struktur, wie du selbst sagst.
 

XHann3sX

Aktives Mitglied
Aber für den Thread Ersteller wäre eine NoSQL-Datenbank viel sinnvoller, als eine relationale Datenbank mit fester Struktur.
Ja, mir wäre hierfür auch eine MongoDB oderso lieber gewesen , aber da das Programm auf einem bereits existierenden Server läuft, wo bereits alle Programme MySQL nutzen wäre es nicht sehr ist es vom Betreiber nicht gewollt, aber da die Daten echt nur im seltensten Fällen ausgelesen werden , sollte das nicht gravierend sein
 

JuKu

Top Contributor
DA hast du aber irgendwas an der Normalisierung nicht verstanden...

Wie mrBrown bereits sagte, brauchst du dann JOINs.
Allerdings kosten JOINs extrem viel Performance, weshalb man in der Praxis lieber auf Normalisierung verzichtet.
Noch teurer sind Abhängigkeiten (Fremdschlüssel usw.).
Manchmal werden sogar Daten deshalb redundant gespeichert, um Abfrage Queries & JOINs zu sparen, diesen Weg gehen z.B. Google oder Facebook. Aber für Big Data sind relationale Datenbanken eh nur bedingt geeignet.
 

Meniskusschaden

Top Contributor
Allerdings kosten JOINs extrem viel Performance, weshalb man in der Praxis lieber auf Normalisierung verzichtet.
Natürlich kosten JOINs Performance. Ob es extrem viel ist, hängt vermutlich davon ab, was man unter extrem versteht. Jedenfalls ist es nicht so viel, dass man deswegen auf Normalisierung verzichten würde. Für die allermeisten Unternehmen dürften deren ERP- oder Warenwirtschaftssysteme das Rückgrat ihrer Organisation bilden. Natürlich wird da normalisiert. Es gibt jede Menge IT jenseits von BigData.
 

Meniskusschaden

Top Contributor
Die Aussage von @JuKu habe ich schon als generelle Empfehlung aufgefasst. Für normale betriebliche Informationssystem würde ich es aber eben anders herum empfehlen: Grundsätzlich normalisieren, es sei denn, es wird zu teuer. In dem Fall verzichtet man dann tatsächlich deswegen - aber eben nicht grundsätzlich. Verzichten ist vielleicht auch nicht ganz treffend, weil es sich häufig so darstellen dürfte, dass man normalisierte Grunddaten auf Transaktionebene hat und aus Performancegründen zusätzlich denormalisierte Aggregationen.
 

Thallius

Top Contributor
Ich möchte echt gerne mal wissen mit was ihr hier alles so arbeitet wenn ihr so einen Unsinn erzählt. Ich arbeite täglich mit Datenbanken mit 6 stelligen Zeilenzahlen und joine teilweise bis zu 10-15 Tabellen dazu. Trotzdem dauert keiner meiner Queries mehr als 2-400ms.

Und jetzt komm mir bitte keiner mit "Das sind ja auch keine großen Zahlen". Ich finde ein Kudenstamm von ca. 20000 Kunden mit über 100000 Systemen nur in .de nicht wirklich klein.

Gruß

Claus
 

mrBrown

Super-Moderator
Mitarbeiter
Ich möchte echt gerne mal wissen mit was ihr hier alles so arbeitet wenn ihr so einen Unsinn erzählt. Ich arbeite täglich mit Datenbanken mit 6 stelligen Zeilenzahlen und joine teilweise bis zu 10-15 Tabellen dazu. Trotzdem dauert keiner meiner Queries mehr als 2-400ms.

Und jetzt komm mir bitte keiner mit "Das sind ja auch keine großen Zahlen". Ich finde ein Kudenstamm von ca. 20000 Kunden mit über 100000 Systemen nur in .de nicht wirklich klein.
'Ich hab das Problem nicht, also gibt es das nicht' - was ist das denn für eine Einstellung?

Ernstgemeine Frage, ohne dich angreifen zu wollen: Verstehst du nicht, warum Normalisierung schlecht für die Performance sein kann oder hältst du den Unterschied einfach für Irrelevant?
 

Thallius

Top Contributor
'Ich hab das Problem nicht, also gibt es das nicht' - was ist das denn für eine Einstellung?

Ernstgemeine Frage, ohne dich angreifen zu wollen: Verstehst du nicht, warum Normalisierung schlecht für die Performance sein kann oder hältst du den Unterschied einfach für Irrelevant?

Ich halte die Geschwindigkeit die eine DB braucht um ein JOIN über eine vernünftig Indizierte Tabelle machen für komplett irrelevant, im Gegenzug zu der Zeit die z.B ein SOAP Webservice zum en- und decoden der Daten braucht.

Heutzutage wird überall Performance verschwendet das einem schwindelig wird. Man benutzt Java Spring als Backend (geht es eigentlich noch inperformanter?), Angular JS oder brutal große Frameworks wie Laravel oder Symphonie als frontend und dann will man Geschwindigkeit verbessern indem man die DB nicht normalisiert. Das ist vollkommen krank.
 

JuKu

Top Contributor
Eine Kette ist nur so stark, wie ihr schwächstes Glied.
Wenn man also Java Spring verwendet, ist die Performance sowieso schon nicht beste. Aber das gehört jetzt nicht in dieses Thema.

@Thallius:
Ganz ehrlich: 6 stellige Zeilenanzahlen in der ganzen Datenbank sind nicht viel. Aber es hat auch gar keiner hier behauptet, dass der Thread Ersteller alles Denormalisieren soll! Wir haben lediglich gesagt, dass JOINS wesentlich unperformanter sind, als denormalisierte Datenbanken. Nicht mehr und nicht weniger.
Wir weichen hier einfach viel zu stark vom Thema ab.

15 JOINs sind echt schon sehr extrem... Sobald ihr mehr Kunden bekommt, skaliert das irgendwann gar nicht mehr gut mit. Und ihr habt damit auch nur die Möglichkeit von Scaling Up, Scaling Out (Datenbank Cluster) würde euch bei so vielen Abhängigkeiten kaum noch Geschwindigkeitsvorteile bringen.

Und btw, 400ms für ein Query ist vieeel zu viel! Eine Webseite sollte im Optimalfall in <400ms ausgeliefert sein, weil noch HTTP Overhead, Verschlüsselung usw. dazu kommt. Wenn man da schon 400ms für die Datenbank bzw. 1 Query verschwendet, dauert so ein Seitenaufbau irgendwann 3 Sekunden - viel zu viel! Schon einen Seitenaufbau von 1 Sekunde empfinde ich persönlich als lästig.
Und Google straft solche langsam Seiten auch deutlich im Suchranking ab (Stichwort SEO, siehe https://developers.google.com/speed/pagespeed/).
Ich selbst versuche immer, dass meine PHP CMS Systeme, die ich geschrieben habe, die Seiten in 200 - 300ms komplett ausliefern (inkl. aller kompletten MySQL Queries, Template Engine, GZip Kompression, usw.).
Bei einem Unternehmen wird aber anders priorisiert, da der Mitarbeiter eh gezwungen ist, seinen Job zu machen, ist es ihm wurscht, ob er 3 Sekunden länger wartet oder nicht. Einem User in der freien Wildbahn würde es allerdings auffallen und es als nervig empfinden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Thallius Ist JSON als column jetzt der neue Standard oder hab ich was verpasst? Datenbankprogrammierung 34
M Frage zu JSON Datenbankprogrammierung 16
M MySQL JSON-Datei auf Datenbank anwenden Datenbankprogrammierung 17
H JSON Array abfrage beschleunigen Datenbankprogrammierung 2
D SQL Server Android App: 'int java.lang.String.length()' on a null object reference Datenbankprogrammierung 15
T JPA: Nach String statt Primärschlüssel suchen Datenbankprogrammierung 9
M Oracle String aus Column splitten und x Rows daraus erstellen Datenbankprogrammierung 1
C String in Datenbank einfügen Datenbankprogrammierung 11
E Conversion failed when converting date and/or time from character string. Datenbankprogrammierung 3
D String übergeben Datenbankprogrammierung 7
M SQLite Suche nach String Datenbankprogrammierung 4
C Objekte aus DB in Strings umwandeln also von List<Objekt> in String Datenbankprogrammierung 6
A ByteArray zu String dann wieder zu ByteArray Datenbankprogrammierung 2
D HSQLDB SQL ORDER BY nur mit fixen String machbar? Datenbankprogrammierung 16
F Dynamischen String in SQL Statement einbinden Datenbankprogrammierung 9
N String Array in While Schleife befüllen Datenbankprogrammierung 2
H Derby: SYSCS_UTIL.SYSCS_EXPORT_QUERY mit String Abfrage in wehre-Klausel nicht möglich Datenbankprogrammierung 3
R Zeichenkette in String zählen Datenbankprogrammierung 3
P GWT Applikation-The method forName(String) is undefined for the type Class Datenbankprogrammierung 10
B Mysql speichert keine 0 alls String Datenbankprogrammierung 11
B MySQL Datenbank Connection als String zurückgeben Datenbankprogrammierung 7
F Oracle ResultSet zu einer HashMap<Integer, String[]> Datenbankprogrammierung 6
I DB-Zelleninhalt mit String vergleichen klappt nicht Datenbankprogrammierung 3
I SQL_Abfrage-Ergebnis (ResultSet) in String[] speichern Datenbankprogrammierung 29
M SQL String Datenbankprogrammierung 2
G Sonderzeichen im String codieren Datenbankprogrammierung 4
K Date in SQL-String konvertieren Datenbankprogrammierung 3
B String aus txtDatei auslesen und in Datenbank schreiben. Datenbankprogrammierung 8
T Mittels SQL-String ein Berechnung vornehmen Datenbankprogrammierung 2
C SQL String zwei Tabellen vergleichen und gleiche Zeile löschen Datenbankprogrammierung 25
C Split String für SQl query Datenbankprogrammierung 10
J String[] in eine SQL-Anweisung implementieren Datenbankprogrammierung 13
F ResultSet to String[] Datenbankprogrammierung 3
S Connection String MS Access mit Systemdatenbank / Arbeitsgruppeninformationsdatei Datenbankprogrammierung 4
G Hilfe um String an Datenbank zu schicken Datenbankprogrammierung 3
M SELECT longtext -> als String behandeln Datenbankprogrammierung 6
G Daten aus ResultSet in String-Liste Datenbankprogrammierung 13
padde479 Connection String Oracle Datenbankprogrammierung 5
T SQL Date String in java.util.Date umwandeln Datenbankprogrammierung 3
G ResultSet: String mit Anführungszeichen einlesen Datenbankprogrammierung 8
A JPA + @OneToMany + String ArrayList Datenbankprogrammierung 4
S Char to String aus DB Datenbankprogrammierung 2
Q string Vergleich Datenbankprogrammierung 2
M Konvertierung eines Ojects to String Datenbankprogrammierung 3
M Preparedstatement SQL-string auslesen Datenbankprogrammierung 13
D INSERT String enthält ' wie kann man das Escapen? Datenbankprogrammierung 4
G MsSQL | Statement.execute(String s) Datenbankprogrammierung 3
G CLOB to String - Encoding Problem Datenbankprogrammierung 6
D String[][] Array in Access Datenbank speichern Datenbankprogrammierung 5
K Hibernate: Liste von String-Werten Datenbankprogrammierung 2
S String probleme Datenbankprogrammierung 3
R Nach String in MySQL datenbank suchen Datenbankprogrammierung 7
M Datum's String in MSSQL oder MySQL wie konvertieren ? Datenbankprogrammierung 3
T String in DB(Oracle) schreiben mit Leerzeichen Datenbankprogrammierung 4
K ResultSet: Erste Zeile ausgeben, Datensatz in String speiche Datenbankprogrammierung 13
E Fehler bei String-Insert in MySQL-DB Datenbankprogrammierung 8
L Datum (String) in MySQL-Tabelle (date) speichern Datenbankprogrammierung 4
C SQLException wenn String auf VARCHAR geschrieben wird Datenbankprogrammierung 10
T Methode getColumnIndex(String columnName) ? Datenbankprogrammierung 6
K string literal too long was tun ? Datenbankprogrammierung 9
Juelin Java und MySQL MariaDB - WHERE-Klausel Datenbankprogrammierung 17
W MySQL-Connector funktioniert nicht über WLAN -> MacOS Datenbankprogrammierung 10
Juelin MySQL Datenbankmit glassfish und Netbeans Datenbankprogrammierung 18
Auf MySql Datenbank zugreifen funktioniert nicht Datenbankprogrammierung 8
TheSkyRider MySQL Datenbankzuordnung in Verbindung mit Java Datenbankprogrammierung 7
Warum funktioniert MySQL nicht Datenbankprogrammierung 8
M MySQL Datenbank in Array Datenbankprogrammierung 2
P MySQL- Neues Passwort Datenbankprogrammierung 1
btwX28 mysql abfrage über phpmyadmin Datenbankprogrammierung 8
sserio SQL oder MySQL Datenbankprogrammierung 44
OnDemand Mysql Query Builder Datenbankprogrammierung 1
Z MySQL "Too many connections" auch nach schliessen der Connections. Datenbankprogrammierung 10
yakazuqi MySQL MySQL Connection reset Datenbankprogrammierung 7
OnDemand MySql Foreign Key nötig oder unnötig Datenbankprogrammierung 3
M Mysql Views und Hibernate Caching Datenbankprogrammierung 4
W MYSQL Datenbank Login Android Datenbankprogrammierung 3
OnDemand MySQL und mongoDB wann macht was Sinn? Datenbankprogrammierung 11
bueseb84 Spring Boot : Update Mysql Datenbank Datenbankprogrammierung 1
Avalon Attribute werden mit Unterstrich in eine MySQL Datenbank eingetragen Datenbankprogrammierung 10
D MYSQL goorm IDE - Wie speichern? Datenbankprogrammierung 0
OnDemand Mysql UPDATE if condition Datenbankprogrammierung 14
D MySQL Geburtsdatum per KW abfragen Datenbankprogrammierung 1
C Java MySQL check if value exists in database Datenbankprogrammierung 2
H Fehler bei getConnection zu MySQL Datenbank Datenbankprogrammierung 18
J MySQL - Primary Key Date,Time vs ID Datenbankprogrammierung 16
ruutaiokwu MySQL: Messwerte, welche stagnieren interpolieren? Datenbankprogrammierung 2
S Datenbank MySQL und Java Datenbankprogrammierung 8
Thallius MySQL JDBC auf Linux Server zu mySQL DB auf anderem Linux Server wirft Access denied Datenbankprogrammierung 5
P Adressadministration mit Java und mySQL Datenbankprogrammierung 14
D MySQL Abfrage Datenbankprogrammierung 5
D MySQL Abfrage sortieren Datenbankprogrammierung 4
platofan23 MySQL Java Programm findet Treiber für mySQL auf Debian-Server nicht? Datenbankprogrammierung 11
J MySQL MySQL Risiken bei Stromausfall minimieren Datenbankprogrammierung 9
D MySQL Abfrage SUM datediff Datenbankprogrammierung 3
H MySQL MySQL - Keine Verbindung zur Datenbank?! Datenbankprogrammierung 4
G MySQL Problem mit MySQL verbindung Datenbankprogrammierung 8
X MySQL Java hat keinen Zugriff auf MySQL Datenbankprogrammierung 9
Z [JDBC][MYSQL] Access denied Datenbankprogrammierung 7
D MySQL Connection richtig herstellen. Wie ? Datenbankprogrammierung 7
D Multiple Connection mit MySQL Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben