Oracle traitant une chaîne vide comme un problème NULL pour un programmeur Java / JPA
Comment gérez-vous cette situation, où l'Oracle stocke la chaîne vide comme valeur null dans la base de données ?
J'aimerais qu'il soit stocké comme une chaîne vide comme il n'est pas NULL, depuis la publication de la requête serait plus facile.
Quelque chose comme cela, sélectionnez la chaîne vide chaîne non vide, mais pas les valeurs null
select * from mytable where myfield like '%';
si je voudrais sélectionner les valeurs null (qui devrait être à l'origine de la chaîne vide), je l'aurais pour sélectionner comme ceci :
select * from mytable where myfield like '%' or myfield is null;
j'aimerais ne pas faire or myfield is null
tout le temps plus tard dans mon sql
La solution actuelle j'ai à l'esprit est de prendre soin de ce au niveau de l'application,
par exemple, dans l'entité, j'initialise tout mon champ de type Chaîne de valeur par défaut d'un espace, par exemple :
@Entity
public class MyEntity {
private String name = " ";
public void setName(String name) {
if (isEmptyString(name)) {
name = " ";
}
}
...
}
Ou peut-être, je peut faire usage d'un nouveau type encore inconnu pour moi à partir d'Oracle 11g, qui peuvent garder une chaîne vide comme elle est, sans la modifier pour la valeur null ?
Merci !
source d'informationauteur bertie | 2011-04-01
Vous devez vous connecter pour publier un commentaire.
Yup, c'est la façon dont Oracle fonctions. Les chaînes vides sont traités comme des valeurs null.
Vous pouvez bien sûr de "corriger" ce de l'application - par exemple en stockant
" "
valeurs comme vous l'avez suggéré, mais considérez d'abord, quelle est exactement la différence avec vos valeurs "chaîne vide" par rapport àNULL
valeurs? Pourquoi avez-vous besoin de les traiter différemment? J'ai utilisé pour exécuter dans ce dilemme, trop, mais généralement découvert qu'il y a très peu de cas où j'ai besoin vraiment de faire la différence.essayer
Non, il n'y a aucun moyen de traiter les chaînes vides comme telles. Oracle traite toujours une chaîne de longueur zéro comme une valeur NULL.
Son tôt pour moi, mais ce n'est pas
le même que
Donc, Oracle simplifie la vie! 😉
Ce n'est pas seulement la sélection spéciale où l'état, mais aussi le traitement de Java des Objets String.
Si vous avez une Chaîne="" vous pouvez appeler sa méthode de longueur et obtenir 0.
Si vous avez une Chaîne=null vous obtenez un nullpointer exception lors de l'appel de la longueur.
Ainsi, travailler avec une db oracle vous oblige à toujours vérifier si votre chaîne est nulle avant la vérification de longueur 🙁
Crois Oracle est l'optimisation de la base de données par la conversion de la chaîne vide comme NULL.
D'abord une chaîne vide peut-être encore besoin d'être stockés de manière explicite dans la base de données de stockage des données au niveau bloc (*1). Le stockage de NULLE peut réduire le stockage des données de l'empreinte.
Deuxième cas échéant indices ont été définis sur la colonne, les valeurs NULL ne sont pas inclus dans l'indice réduisant ainsi l'index de l'espace de stockage. (*2)
À partir d'un dessin et de perspective de développement, à moins que le vide de l'espace change vraiment la sémantique des données à partir d'un point de vue commercial, le stockage de NULLE doit être fine.
Ajouter du code au niveau du cadre ( ou de la classe parent ) comme suggéré ci-dessus permettrait d'éliminer la nécessité pour les taper à toutes les classes d'enfants & objets - qu'est ce que l'Orienté Objet et la même base de la programmation à s'efforcer de faire.
Si mon code fonctionne le mieux, car ma base de données de stockage est optimisé, alors que je devrais être heureux.
Elle suce si mon code de la performance des réservoirs dans le processus de production, parce que je voulais sauver un peu de frappe ou n'a pas fait magistrale de conception /développement?
Je serais heureux que Oracle est l'optimisation pour moi sous les couvertures.
Tout sur Oracle NULL:
NULL est une valeur spéciale.
NUL n'équivaut pas à quoi que ce soit, y compris lui-même, j'.e NULL n'est pas égal à NULL