IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

[SQL Server 2000] Caractere non toléré


Sujet :

MS SQL Server

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut [SQL Server 2000] Caractere non toléré
    Bonjour à tous,

    Je ne suis pas certain que mon probleme concerne directement sql server : / mais bon je tente le coup.
    j'ai le probleme suivant : j'ai une colonne nvarchar qui contient apparemment des caracteres invisibles non tolérés (unicode mal géré apparemment).
    Effectivement, quand je cast ma colonne en varbinary je trouve

    0x45006D0070006C006F0079006500650028007300290020003A00200000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F000000070000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F000000070000003F0000003F0000003F00

    Donc ma chaîne est mal terminée ce qui me génère des erreurs.
    Mais comment repérer le probleme dans la chaîne ? comment trouver quoi supprimer ?

    Si à défaut vous pouvez m'aiguiller sur un site ou autre qui pourrait m'aider je suis preneur :'(

    Merci d'avance !

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut
    Si tu veux retirer des caractères indésirables dans ta chaine, il y a un méthode simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    UPDATE table1
    SET ch1=REPLACE(ch1,CHAR(10),'')
    La fonction CHAR renvoie le caractère demander en fonction du code ASCII passer en paramètre. Je ne sais pas si c'est la meilleure méthode mais c'est une option.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Certes, merci de ta réponse ^^
    Mais justement je ne connais pas le caractère indésirable ! je le traque ce fourbe ! Mais je n'arrive pas à le voir pour l'instant : /

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut
    Ce que tu peux faire c'est une procédure te renvoyant les codes ASCII des caractères invisibles.
    A patir d'une table ASCII, tu peux avoir l'intervalledes caractères invisibles.
    Ensuite tu crées une procédure qui boucle dans cet intervalle et qui renvoie la valeur du caractyère invisible trouver ainsi que sa position.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    CREATE PROCEDURE maProc
    AS
    DECLARE @carac VARCHAR(1)
    DECLARE @val INT
    SET @val=10
    SET @carac = CHAR(@val) //code ASCII du premier caractère invisible
    WHILE @carac <> CHAR(65) //code ASCII du premier caractère visible
    BEGIN
    rechcerche du carcatère
    si trouvé 
    retour des valeurs.
    Sinon
    SET @val =@val +1 
    SET @carac = CHAR(@val)
    END
    GO

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Ok je vais essayer de bidouiller un truc dans ce sens, merci de ton aide !

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    alors apres recherche un peu plus poussée, dans toutes mes lignes à probleme, la colonne vicieuse est "paddée" avec cette suite de caracteres :
    00003F00
    Savez vous si cela correspond à un padding standard SQL ou quelque chose dans le genre ?
    m'étonnerait fortement mais bon je prefere être sûr avant de virer cette chaîne dans tous mes enregistrements.
    Ca correspond peut etre à un caractere asiatique quelconque puisque je suis en unicode ^^ (donc d'ailleurs si je suis en unicode ma véritable chaîne serait 003F simplement)

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Encore une question à ce sujet !
    J'essaye de vérifier que le probleme vient bien de ce padding bizarre
    00003F00
    J'essaye donc de créer un enregistrement valide contenant la meme chaîne que l'enregistrement pourri, et je voudrai lui ajouter manuellement ce padding.
    La fonction NCHAR fonctionne avec l'ASCII décimal, et non l'hexa, donc en convertissant ca me donne 00630 (de mémoire), et donc à la fin de ma chaîne je concatene NCHAR(00630) mais la pas de probleme. Et quand je reprends le cast en varbinary de ma colonne, c'est pas 00003F00 que je vois mais un truc genre 602.
    Je me suis trompé en convertissant ? y'a pas une fonction permettant les allers-retours entre ASCII hexa et nvarchar ?
    Et si je n'arrive pas à ajouter le padding manuellement, comment pourrais-je l'enlever ? comment dire "à partir de cette chaîne binaire tu tronques" ?

  8. #8
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    En effet, c'est moche. On voit en faisant un REVERSE de ta chaîne, qu'il y a des caractères supplémentaires, ça a l'air de se terminer par un ?. Tu vois d'ailleurs bien mieux le résultat si tu affiches de jeu de résultat en texte dans SSMS.

    Une idée: tu reconnais le premier caractère invalide, et tu tronque ta chaîne à partir de là.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    DECLARE @position int, @n nvarchar(1000)
    SET @position = 1
    SET @n = 0x45006D0070006C006F0079006500650028007300290020003A00200000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F000000070000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F000000070000003F0000003F0000003F00
    WHILE @position <= DATALENGTH(@n)
       BEGIN
       SELECT @position as Position, 
          CONVERT(nchar(1), SUBSTRING(@n, @position, 1)) as UnicodeCharacter,
          UNICODE(SUBSTRING(@n, @position, 1)) as UnicodeValue
       SET @position = @position + 1
       END
    GO
    -- nettoyage
    DECLARE @n nvarchar(1000)
    SET @n = 0x45006D0070006C006F0079006500650028007300290020003A00200000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F000000070000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F000000070000003F0000003F0000003F00
    SELECT @n, DATALENGTH(@n), LEN(@n)
    SET @n = LEFT(@n, CHARINDEX(NCHAR(63),@n))
    SELECT @n, DATALENGTH(@n), LEN(@n)

Discussions similaires

  1. [SQL SERVER 2000] Base de donnée non relationnelle
    Par Phenomenium dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 31/03/2008, 10h39
  2. SQL Server 2000 :demarrage non-administrateur
    Par maxtin dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 23/07/2007, 16h16
  3. [SQL Server 2000] Extraction dans une chaine de caracteres
    Par KOFJCH dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/10/2006, 09h28
  4. Réponses: 9
    Dernier message: 28/07/2006, 17h38
  5. fonction utilisateur non reconue par sql server 2000
    Par ouedmouss dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 05/09/2005, 07h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo