Ich finde es frustrierend, dass dieselben Abfragen in verschiedenen DBMS nicht funktionieren.
Ja. Ich finde es frustrierend, dass sich die Scheinwerfer und Wischersteuerungen in verschiedenen Autos nicht immer an derselben Stelle befinden. Da ich es nicht kontrollieren kann, lerne ich damit zu leben. Ich halte mich im Allgemeinen an bestimmte Automarken, aber der Ort dieser Dinge steht nicht ganz oben auf der Liste der primären Entscheidungskriterien. Ebenso wähle ich keine Datenbankplattform aus, weil der Prozentsatz des Standards, den sie abdecken, oder wie viele Abfragen genauso funktionieren wie in Oracle und MySQL.
Beispielsweise scheinen einige DBMS (wie Microsoft SQL Server und MySQL) die Tabelle information_schema zu unterstützen, während andere (wie SQLite) dies nicht tun.
INFORMATION_SCHEMA
war eine interessante Wahl. Ja, einige Plattformen haben sich dafür entschieden, diesen Standard überhaupt nicht zu unterstützen. Andere haben das Nötigste abgedeckt. Ich mache ein ziemlich starkes Argument gegen die Verwendung INFORMATION_SCHEMA
in SQL Server, zum Beispiel:
In einigen Datenbanken wie MySQL können Sie SHOW TABLES usw. erstellen.
Ja, einige Datenbanken sind berüchtigter als andere, weil sie nur Dinge erfinden, die für den Entwickler zu dieser Zeit knietief im Code sinnvoll erscheinen ( LIMIT
und ihre perverse GROUP BY
Vergebung sind andere Beispiele).
Warum sind verschiedene DBMS so inkompatibel und abweichend?
Ich bin sicher, einige machen Dinge wie, SHOW TABLES
weil das als einfacher angesehen wird als SELECT name, other cols FROM sys.tables;
. Tatsächlich würde ich wetten, dass dies das Problem mit der Mehrheit der weltweiten Codebasis ist, einschließlich RDBMS; Menschen neigen dazu, das zu tun, was einfacher ist als das, was richtig ist.
Ich bin mir jedoch nicht sicher, ob es ein Problem ist, dass die verschiedenen Plattformen nicht kompatibel und "abweichend" sind, wie Sie sie nennen.
Warum folgen sie nicht dem SQL-Standard?
Es ist schwierig, den gesamten Standard abzudecken. Nur abdeckenDer Standard ist noch schwieriger. Anbieter entwickeln Erweiterungen des Standards und proprietäre Funktionen, die (noch) nicht vom Standard abgedeckt werden, um Benutzern leistungsfähigere Plattformen zu bieten. Stellen Sie sich vor, wir würden auf die nächste Iteration des Standards warten, bevor wir etwas entwickeln könnten? Stellen Sie sich vor, alle Plattformen decken den vollen Standard ab und nichts als den Standard? Stellen Sie sich vor, alle Plattformen hätten nur neue Funktionen implementiert, die sie alle zur gleichen Zeit entwickeln und freigeben wollten. Was wäre der Sinn verschiedener Plattformen? Sie wären alle gleich, und die Inkompatibilität wäre kein Problem mehr, da Sie ohne Risiko frei zwischen Plattformen wechseln könnten - aber warum sollten Sie dann, wenn sie alle gleich sind? Sehen Sie sich das Problem an, das Sie "lösen" - es entsteht nur ein anderes Problem.
Nehmen Sie zum Beispiel Indizes. Der Standard kümmert sich nicht um die physische Implementierung, und einige Anbieter haben beschlossen, alle Arten von nützlichen Indexvariationen und physischen Speichermechanismen zu implementieren, um ihre Plattformen zu verbessern. SQL Server hat Indizes gefiltert, einschließlich Spalten, XML-Indizes, Volltextindizes, In-Memory-Tabellen, Spaltenspeicher usw. usw. Keine davon lesen Sie im Standard. Wie sollen sie diese Dinge bei der Entwicklung mit irgendetwas kompatibel machen, das Oracle möglicherweise entwickelt oder plant? Postgres hat die Entscheidung getroffen, dass eine ausgefeilte JSON-Unterstützung weitaus wichtiger ist als beispielsweise Leistungssteigerungen durch Parallelverarbeitung. Das ist in Ordnung und völlig in ihrem Recht. Das bedeutet nicht, dass SQL Server dasselbe tun soll.
Normales Ad-hoc-CRUD-Material sollte für grundlegende Vanilla-Tabellen plattformübergreifend identisch funktionieren (obwohl MySQL selbst dort einige funky Dinge wie die Verwendung von Backticks um Tabellennamen standardmäßig getan hat, die entfernt werden müssen, wenn versucht wird, den Code auf eine andere Plattform zu portieren ). Sobald Sie anfangen, etwas Exotischeres außerhalb des normalen Speicherns und Abrufens zu tun, wirft der Standard seine Arme in die Luft. Sie möchten Fensterfunktionen? Okay, Ihr Anbieter muss die Ärmel hochkrempeln und implementieren, da die meisten Plattformen sie nicht haben und viel Arbeit erfordern. Selbst SQL Server ist noch nicht vollständig, aber sie sind den anderen weit voraus. Und sie haben viele andere Sprachfunktionen, über die ich mich sehr freue, obwohl sie nicht im Standard enthalten sind.
Welche können den SQL-Standard gut einhalten?
Welche sind notorisch schlecht darin, den SQL-Standard einzuhalten?
Ich weiß nicht genug über den vollständigen Standard und alle Plattformen, um Kommentare abzugeben. Aber ich werde Folgendes vorschlagen: Wenn Sie sich aus diesem Grund für die eine oder andere Plattform entscheiden, hören Sie auf, was Sie gerade tun, und fragen Sie sich, warum dies so wichtig ist. Ich werde auch vorschlagen, dass SQL Server viel besser darin geworden ist, den Standard einzuhalten und Erweiterungen dort zu implementieren, wo sie von Vorteil sind (ein Rückblick in die Geschichte auf Dinge wie timestamp
und, ja, top
zeigt, dass sie sich früher viel weniger darum gekümmert haben). Einige andere Plattformen geben dem Standard einen großen Mittelfinger und tun dies auch weiterhin.
show tables
nochtop 10
nochlimit 10
ANSI SQL. Und mit MySQL und SQL Server haben Sie tatsächlich die beiden ausgewählt, die sich am wenigsten um SQL-Standards kümmern (nur Erwähnung||
vs.+
für die Verkettung von Zeichenfolgen)