Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1441 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQLSERVER] Trim aléatoire (??) sur les champs char

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQLSERVER] Trim aléatoire (??) sur les champs char

n°2327081
Dame de Pi​ques
Qui s'y frotte s'y pique
Posté le 03-01-2019 à 14:13:38  profilanswer
 

Bonjour,
 
J'ai un comportement complètement erratique sur une base SQL server, je suis curieuse de savoir si vous avez déjà rencontré ça.
 
J'ai une table, avec un champ char(2) que j'essaie de requêter :  
 

select phonetype_id from contact_phone where contact_no = 76909

ça me renvoie la valeur 'T ' (avec un espace après le T).
 
Normal, me direz-vous, c'est un char(2) donc il me renvoie 2 caractères.
 
Mais quand je fais :

select phonetype_id from contact_phone where contact_no = 76909 and seqno = 10

Là, ça me renvoie 'T' sans espace  :heink:  
 
 
Mais ça n'est pas fini !

select phonetype_id from contact_phone where contact_no = 76909 order by phonetype_id

>> Pas d'espace non plus  [:ghilghamesh]  
 

select phonetype_id, phonetype_id+'.' as test from contact_phone where contact_no = 76909

>> Pas d'espace, ni dans phonetype_id, ni dans test  :pt1cable:  
 
 
Sachant que j'ai de vieilles copies de cette base, où ça me renvoie 'T' sans espace dans tous les cas...
Mais évidemment, c'est uniquement sur cette table, parce que sur d'autres champs char(2) d'autres tables, ça me renvoie bien 2 caractères.
 
J'ai l'impression d'être entrée dans une dimension parallèle [:apges:5]


Message édité par Dame de Piques le 03-01-2019 à 14:16:43

---------------
Make our planet great again. - Слава Україні!
mood
Publicité
Posté le 03-01-2019 à 14:13:38  profilanswer
 

n°2327109
TotalRecal​l
Posté le 03-01-2019 à 18:14:48  profilanswer
 

Colonne NOT NULL ou NULL ?
Pas de paramètre particuliers (ANSI_PADDING et cie) selon les cas ?
Tu es sûre que tu as bien juste un seul caractère dans ta colonne (comment tu fais pour sortir les résultats pour bien mettre en évidence le ou les blancs ?) et pas que parfois l'espace serait à gauche à ton insu ou un truc comme ça, qui du coup fait qu'il n'y en a pas à droite ?
Possible d'avoir un exemple complet pour reproduire le cas ?
 
Perso je ne m'amuse jamais avec les trucs à largeur fixe, trop de problèmes à gérer par la suite :o


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2327117
Dame de Pi​ques
Qui s'y frotte s'y pique
Posté le 03-01-2019 à 18:53:40  profilanswer
 

TotalRecall a écrit :

Colonne NOT NULL ou NULL ?

NULL.
 

TotalRecall a écrit :

Pas de paramètre particuliers (ANSI_PADDING et cie) selon les cas ?


Ah bon sang de bois, le ANSI padding status !  [:bastian:3]  
Effectivement, il est à false sur ce champ alors que sur mes autres champs il est à true. Je ne savais pas qu'on pouvais le mettre pour une colonne spécifiquement, je pensais que c'était une option globale de la base :jap:  
 
Ceci dit, cela n'explique pas pourquoi il y a un cas où il me le renvoie avec le padding quand même  [:transparency]  
Ni pourquoi ça ne fait pas ça dans mes vieilles bases...  [:transparency]  
 

TotalRecall a écrit :

Tu es sûre que tu as bien juste un seul caractère dans ta colonne (comment tu fais pour sortir les résultats pour bien mettre en évidence le ou les blancs ?) et pas que parfois l'espace serait à gauche à ton insu ou un truc comme ça, qui du coup fait qu'il n'y en a pas à droite ?
Possible d'avoir un exemple complet pour reproduire le cas ?


Au départ, je m'en suis rendue compte en débuggant mon appli .Net qui utilise EntityFramework pour accéder à la bdd. Je voyait bien "T" et "T " dans les variables du debugger, mais je soupçonnais un bug d'EF donc je suis passée directement sur SSMS.
En copiant/collant les résultats de SSMS dans Notepad++ pour voir tous les caractères, il n'y a pas de doute permis.
 

TotalRecall a écrit :

Perso je ne m'amuse jamais avec les trucs à largeur fixe, trop de problèmes à gérer par la suite :o

Malheureusement je n'ai pas la main sur cette base, qui est un progiciel fourni par un tiers, je ne fais que requêter dessus.
 
Et les trucs à largeur fixe, c'est peut-être le moins moche dans cette base. :o Imaginez plusieurs centaines de tables, et pas une seule clé étrangère  [:sophiste:1]

Message cité 1 fois
Message édité par Dame de Piques le 03-01-2019 à 18:57:25

---------------
Make our planet great again. - Слава Україні!
n°2327129
TotalRecal​l
Posté le 04-01-2019 à 09:35:52  profilanswer
 

Dame de Piques a écrit :


Ah bon sang de bois, le ANSI padding status !  [:bastian:3]
Effectivement, il est à false sur ce champ alors que sur mes autres champs il est à true. Je ne savais pas qu'on pouvais le mettre pour une colonne spécifiquement, je pensais que c'était une option globale de la base :jap:

 

Ceci dit, cela n'explique pas pourquoi il y a un cas où il me le renvoie avec le padding quand même  [:transparency]
Ni pourquoi ça ne fait pas ça dans mes vieilles bases...  [:transparency]

 



Honnêtement je ne sais pas t'expliquer pourquoi le comportement diffère selon la requête, je ne suis pas DBA.
Ce genre de lecture peut peut être aider à y voir plus clair : https://sqlstudies.com/2017/06/15/t [...] -shouldnt/
Je comprend bien que tu ne maitrises pas le schéma et je prêche peut être déjà une convaincue, mais c'est le genre de bizarreries et de contraintes qui me font fuir les champs à taille fixe. Pour moi ces types sont un archaïsme du début des SGBDR, qu'on est venu enrichir après avec ces bidouilles optionnelles de padding.
Je préfère un bon vieux VARmachin partout où je stocke du texte ou du binaire.
Après encore une fois je ne suis pas DBA :o.

 
Dame de Piques a écrit :


Au départ, je m'en suis rendue compte en débuggant mon appli .Net qui utilise EntityFramework pour accéder à la bdd. Je voyait bien "T" et "T " dans les variables du debugger, mais je soupçonnais un bug d'EF donc je suis passée directement sur SSMS.
En copiant/collant les résultats de SSMS dan Notepad++ pour voir tous les caractères, il n'y a pas de doute permis.


Ok, je voulais juste être sûr que c'est pas un souci de lecture ambigüe. Perso quand je fais ce genre de chose je viens encadrer le champ avec des guillemets, apostrophes ou ce que tu veux lors du SELECT comme ça si il y a un machin inattendu autour de la valeur significative il ressort.

 
Dame de Piques a écrit :

Malheureusement je n'ai pas la main sur cette base, qui est un progiciel fourni par un tiers, je ne fais que requêter dessus.

 

Et les trucs à largeur fixe, c'est peut-être le moins moche dans cette base. :o Imaginez plusieurs centaines de tables, et pas une seule clé étrangère  [:sophiste:1]


J'ai pas besoin d'imaginer, le client pour lequel j'interviens actuellement en a une tout pareil. Sur lequel ils gèrent en plus un schéma dynamique à coups de concaténation de bouts de requêtes en procédural (un nouveau type de bidule à stocker -> une table qui apparait par magie) [:cerveau sadnoir].

Message cité 1 fois
Message édité par TotalRecall le 04-01-2019 à 09:37:20

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2327149
Dame de Pi​ques
Qui s'y frotte s'y pique
Posté le 04-01-2019 à 13:33:00  profilanswer
 

TotalRecall a écrit :


Ok, je voulais juste être sûr que c'est pas un souci de lecture ambigüe. Perso quand je fais ce genre de chose je viens encadrer le champ avec des guillemets, apostrophes ou ce que tu veux lors du SELECT comme ça si il y a un machin inattendu autour de la valeur significative il ressort.
 

C'est ce que j'ai essayé de faire (cf. ma dernière requête), mais ça ne donne pas le même résultat, c'est un truc de ouf. :pt1cable:  
 
Enfin bref, j'ai ajouté un trim côté C# pour avoir toujours la même chose quoi que me renvoie SQL Server, et puis c'est marre  [:fl4me]  
 
Mais c'est quand même hyper mystérieux, comme comportement   [:rfv:5]  
 

TotalRecall a écrit :


J'ai pas besoin d'imaginer, le client pour lequel j'interviens actuellement en a une tout pareil. Sur lequel ils gèrent en plus un schéma dynamique à coups de concaténation de bouts de requêtes en procédural (un nouveau type de bidule à stocker -> une table qui apparait par magie) [:cerveau sadnoir].


 [:shlavos]
Y'a des gens qu'on ne devrait jamais laisser s'approcher d'une base de données  :pfff:


---------------
Make our planet great again. - Слава Україні!

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQLSERVER] Trim aléatoire (??) sur les champs char

 

Sujets relatifs
Système de log de champs de BD mis à jourCode jeux du nombre aléatoire en python 3.6
SQL Créer une vue avec Nom Champs et Valeur dans des enregistrementspromenade dans un const * char (débutant)
[VBA Excel] Tirage de personne en aleatoire selon 2 conditionsmodifier un char *
appel au générateur des nombres aleatoire dans un programme c++[Python] Sous échantillon aléatoire pas vraiment aléatoire! Pourquoi ?
champs de saisie qu permet d'isoler une lignelister les champs d'une table en connexion odbc
Plus de sujets relatifs à : [SQLSERVER] Trim aléatoire (??) sur les champs char


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR