9
votes

Portabilité SQL GOTCHAS

Ma compagnie est de travailler sur une finition à la fin de l'oracle pour un orje python. Je suis émerveillé à quel point les rdbmses différemment font des choses même pour les choses simples. J'ai beaucoup appris sur les différences entre Oracle et d'autres RDBMS. Juste hors de curiosité pure, j'aimerais en savoir plus.

Quels sont des "gotchas" communs en termes de portion SQL d'une plate-forme à une autre?

s'il vous plaît, un seul gotcha par réponse.


1 commentaires

Comparaison sur plusieurs points: TROOLS.ARVIN.DK/DB/RDBMS


17 Réponses :


2
votes

Oracle n'autorise pas une instruction SELECT sans une clause de la clause. Par conséquent, vous ne pouvez pas faire de questions telles que ceci: xxx pré>

à la place, vous devez dire que la requête provient de la table Dual code> Table: P>

SELECT 1 FROM DUAL


2 commentaires

Oracle autorise-t-il l'endroit où 1 ou doit-il nécessiter où 1 = 1?


@jmucchiello: Non, ça ne le fait pas. Ni elle n'a pas de type booléen dans SQL (mais a à PL / SQL).



0
votes

Différentes bases de données gère un peu les données binaires différemment. Donc, par exemple, cela fonctionnera sous MySQL:

SQL> INSERT INTO t VALUES (rawtohex('z'));

1 row created.


0 commentaires

2
votes

Un autre exemple consiste à générer des touches primaires uniques (typiquement de substitution).

De nombreuses bases de données, telles que SQL Server et SQLite, permettent une colonne d'être déclarée comme une identité: Généralement, si la valeur de cette colonne manque à l'insert, La base de données générera une valeur unique pour la colonne.

oracle, en revanche, vous avez créé une séquence distincte à la table, puis utilisez NextVal sur la séquence pour générer la valeur suivante: < Pré> xxx

ou, plus typiquement: xxx


1 commentaires

PostgreSQL prend en charge le type de données série. Autant que je sache, cela est mis en œuvre par une séquence. MySQL a l'attribut Autooincretime d'une colonne ainsi qu'une cale de compatibilité pour la série (qui devient une colonne AutoInCriments Bigint).



2
votes

Quels sont des "gotchas" communs en termes de portion SQL d'une plate-forme à une autre?

Même chose que les tentatives de traduction de anglais vers russe en substituant les mots du dictionnaire directement dans les phrases.

fonctionne pour bonjour < / em> et au revoir , mais échoue à Mary avait un peu d'agneau pour ne rien dire de Shakespeare.

Différent rdbms 'S avoir des cultures différentes, malgré avoir SQL dans leur nom.

Par exemple, la limitation de la ligne.

dans oracle oracle : xxx

in SQL Server : xxx

in mysql et postgreSQL : xxx

in db2 : xxx

Quatre clauses .


4 commentaires

Surtout que la clause limite de MySQL vous permet également de spécifier une ligne de départ (par exemple la limite de 20, 10) qui rend la pagination vraiment facile à faire, mais est une douleur sur SQL Server.


Et n'oubliez pas que Rownum ne fonctionne pas comme vous pourriez penser. Où ROWNUM> 1 causera Oracle pour renvoyer un ensemble vide car il numériquement les rangées durent, donc aucune ligne n'est jamais numérotée 1, aucune ligne ne peut jamais être supérieure à 1.


C'est ce que j'ai dit. C'est pour le lien sur l'utilisation de Row_Number ().


@jumucchiello: c'était un lien vers un article dans mon blog, juste pour montrer que je ne le pense pas :)



2
votes

Quères de la clause multi-valeur. J'avais l'habitude de les utiliser tout le temps sur Oracle et j'ai été surpris de constater que vous ne pouvez pas le faire dans SQL Server. Par exemple, cette requête:

SELECT * FROM mytable WHERE (col1, col2) IN ( SELECT col1, col2 FROM othertable )


0 commentaires

1
votes

Les problèmes de performance sont un grand. Par exemple, des vues à Oracle sont, Afaik, à peu près aussi vite que des tables. Ce n'était pas le cas avec SQLServer lorsque je devais les utiliser. Les vues ont effectivement tué les performances ralentissant les mêmes sélections par un ordre de grandeur ou plus (une requête droite des tables a pris, par exemple 0,5, tout en utilisant une vue pouvant prendre une minute). Il y avait aussi beaucoup de limitations sur leur utilisation, par exemple toutes les fonctions SQL pourraient être utilisées sur des vues.

Notez que c'était vrai il y a 5-6 il y a six ans, je ne sais pas si Microsoft l'a améliorée depuis.


1 commentaires

Je pense que les vues indexées dans SQL Server 2005+ ont un peu d'aide avec les problèmes de performance.



1
votes

Syntaxe de jointure obscur, comme la syntaxe d'Oracle (+) pour les jointures extérieures. Lors d'une entreprise, j'avais l'habitude de travailler pour cette syntaxe a été utilisée partout que la syntaxe de jointure externe gauche / gauche de gauche / gauche, ce qui a porté des trucs sur MySQL une douleur.


4 commentaires

ANSI REJOIGNE est entré dans Oracle uniquement par 9i, et cela n'a été que par an que nous avons cessé un soutien de 8i et que nous sommes en mesure de les utiliser pour toutes les mises à jour.


La syntaxe Oracle est standard SQL de style ancien. La Syntaxe de jointure intérieure est ajoutée à SQL ultérieurement. Il y en a une discussion dans les réponses à cette question: Stackoverflow.com/Questtions/894490/...


Intéressant, il semble toujours que même la syntaxe de style ancienne était incompatible - avec Oracle utilisant (+) et SQL Server à l'aide de * = = =


Et garçon, vous ne voulez pas porter cela à SQL Server, même de changer de syntaxe équivalente = ou = car il ne produit pas de résultats corrects tout le temps (parfois, il interprétera comme une jointure croisée).



2
votes

Oracle ne vous permettra pas d'insérer des chaînes vides: elles sont converties silencieusement en NULL.


2 commentaires

N'a pas compris cela. Merci!


C'est pourquoi nous avons Varchar2's. Oracle conseille contre l'utilisation de Varcharne pour les versions actuelles, car ils se réservent que cela doit être compatible ANSI à l'avenir (i. E. Certains jour Varcharner distinguera entre Null et une chaîne vide)



0
votes

Définir le support de l'opérateur.

Outre l'Union / Union Tout, définissez la prise en charge de l'opérateur est assez remarquable entre les bases de données. Server Oracle et SQL Server La plupart d'entre eux, mais Oracle prend en charge une opération moins opérationnelle ainsi que la norme équivalente à l'exception de l'opération distincte. AFIK, MySQL prend uniquement en charge l'Union (aucun intersect ou sauf support).


1 commentaires

Je crois que ici encore, comme mentionné ailleurs, moins l'inclusion de l'inclusion de l'exception des normes. Moins remonte un long chemin: Je me souviens d'avoir utilisé l'utilisation d'Oracle 5.1.22 au moins, quelque temps vers 1989 ...



1
votes

Oracle ne vous permet pas d'avoir plusieurs inserts dans une requête. MySQL permet à cela: xxx


2 commentaires

Eh bien, ça fait - sorta. Vous pouvez utiliser un commentaire ... Fin: bloc PL / SQL ou traitement de la matrice. Non plus c'est exactement un tas de plaisir.


Ni aussi élégant;), et avec Pl / SQL, vous voudriez utiliser des variables de liaison pour éviter de renier le curseur sur chaque insertion ..



0
votes

Je ne sais pas si cela est vrai dans les pilotes qui viennent avec Python, mais dans la version "Horrable", j'ai utilisé, si une colonne d'un résultatsset renvoie null pour toutes les valeurs de la colonne, le La colonne elle-même n'est pas retournée dans la structure des Resultats . Cela pourrait (et souvent) entraîner des bugs de production impossibles à dupliquer le développement.

Depuis que vous m'éloignez d'Oracle, cela ne devrait pas être une préoccupation, mais il existe un mot-clé les développeurs utilisent pour atténuer cette "fonctionnalité" que je doute est prise en charge dans MySQL. J'oublie ce que c'est, cependant, et Google ne aide pas.


0 commentaires

2
votes

Oracle a une approche différente des citations opposées à MySQL.

MySQL: 'It\'s easy'
Oracle: 'It''s slightly confusing'


3 commentaires

MySQL peut soutenir \ 'pour insérer une citation littérale, mais la norme SQL (puisque SQL89, je crois) a utilisé' '


C'est un peu contre-intuitif. Toujours, un gotcha valide;)


Et SQL Server utilise des crochets pour échapper aux noms d'objet. Notez également que Oracle ne vous permet pas d'échapper à une double citation dans un nom d'objet.



4
votes

Oracle ne semble pas avoir de problème avec des curseurs, ce sont un problème de performance énorme dans SQL Server.

En fait, toutes les performances Tuning sont spécifiques à la base de données (c'est pourquoi le code standard ANSII fonctionne souvent très mal par rapport aux meilleures méthodes conçues dans la saveur spécifique de SQL spécifique à la base de données).

Les dates sont une autre chose qui semble être traitée très différemment de la base de données à la base de données.

Les fichiers de données ne sont pas équivalents non plus. Une chose qui a tendance à obtenir des nouveaux arrivants sur SQL Server est que le type de données de l'horodatage n'a absolument rien à voir avec les dates et les temps et ne peut pas être converti en une valeur de type de données.


3 commentaires

La chose de l'horodatage me confondait aussi bien à SQL Server. Après avoir vu comment ils travaillaient, ma première pensée était pourquoi personne n'utiliserait jamais ces choses?


@HLGEM: dans SQL Server, ce ne sont pas les curseurs qui causent problème de performance, c'est qu'ils sont mal utilisés. Un curseur statique est en fait plus efficace qu'une table temporaire (qui est généralement informée en remplacement). Explicextended.com/2009/06/28/Le-island -Of-Misfit-curseurs


SQL Server a un nouveau nom pour l'horodatage, Rowversion. A plus de sens. Veuillez utiliser. La colonne Timestamp / Rowversion est utile pour un "verrouillage optimiste". Pas sûr du bon terme. L'extrémité frontale attrape un enregistrement mais ne se verrouille pas. L'utilisateur modifie l'enregistrement. Une fois enregistré, l'extrémité avant vérifie que le Rowversion est le même que ce qui a été lu. Sinon, quelqu'un d'autre a écrit à cette RWO, et la fin de l'avant peut être une erreur au lieu d'écraser.



2
votes

1
votes

Tables temporaires - Oracle vs SQL Server / MySQL. Transition de Oracle à MS / MySQL, aucun problème. L'inverse, un peu différent.


0 commentaires

1
votes

Pour la grande image sur le produit GOTCHAS, vous devez apprendre la différence entre la conception logique de la base de données et la conception de la base de données physique.

La conception de la base de données logique a principalement lieu avec des fonctionnalités des tables. Les caractéristiques des tables incluent des colonnes et des contraintes. Bien que les tables elles-mêmes soient physiques, la conception de la table est généralement très portable d'un système de base de données à une autre. Il existe des différences dans la manière dont certains datatypes fonctionnent et quelques différences de syntaxe, comme si le soulignement peut être utilisé dans un nom de table ou non. Mais une bonne conception logique devrait porter d'un système à un autre avec des modifications mineures ou aucun changement.

La conception de la base de données physiques concerne principalement les caractéristiques de l'infrastructure sur laquelle repose la structure de la table. Presque tous les systèmes de support de systèmes et le type d'index par défaut est B-Tree, bien que cela puisse être appelé autre chose. Mais à partir de là, chaque système a ses propres caractéristiques physiques, qui peuvent être complètement différentes d'un système à l'autre. Une caractéristique physique typique de Oracle est des espaces de table. De près, les espaces de table sont de la cartographie entre les tables et les espaces de table. La conception physique doit être effectuée sur une base spécifique au système.

Outre quel système RDM que vous utilisez, vous devez prendre des données de données, de charger, des exigences de temps de réponse et des ressources système telles que des disques dans votre conception. La bonne nouvelle est que beaucoup de modifications apportées à la conception physique peuvent être apportées sans modification du code d'application. Ceci est connu comme indépendance des données physiques. Cela signifie que vous êtes quelque peu libre de modifier et de régler la décoloration physique après que vous obtenez du code d'application écrit et que certaines données sont chargées.

Vous voudrez peut-être examiner certains livres sur la conception de la base de données pour obtenir une idée plus profonde de la conception logique et physique et la différence entre eux. Certains auteurs populaires sont C.J. Date et Joe Celko.


1 commentaires

Avez-vous des chances de recommander certains livres particuliers? C'est un sujet que je souhaiterais vraiment en savoir plus sur.



1
votes

Je me souviens d'un problème d'oracle particulier qui m'a complètement gêné. Je ne suis pas sûr que c'était une configuration de l'instance ou des paramètres par défaut, mais nous n'avons pas pu avoir plus de 1000 éléments dans une déclaration dans une déclaration. Nous avons donc dû le tromper à faire ce qui voulait: xxx

etc.

moche, mais cela a fonctionné.

(avant que quiconque ne souligne la solution évidente d'une sous-requête ou d'une vue en ligne, la requête a été générée sur un système complètement différent)


0 commentaires