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

Sybase Discussion :

Extraction champ "multi-encodage"


Sujet :

Sybase

  1. #1
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut Extraction champ "multi-encodage"
    Bonjour,

    j'ai un petit souci avec l'encodage, en fait je souhaiterais extraire un champs de 20 caractères Unicode (soit 40 caractères ASCII), seul souci, le champ en question contient un mélange de caractères Unicode et ASCII.

    Exemple :
    立顿奶茶巧克力热吻12*S10*16.5G-H
    J'aimerais pouvoir unifier le tout et donc couper au bon caractère pour avoir une longueur fixe.

    Mon but étant de concaténer une chaîne à la suite toujours à la même position, seulement ça ne fonctionne pas à cause du problème ci-dessus.

    Mon code :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    -- Substring the description at the optimal character
    -- Unicode takes 2 ASCII characters when printing
     
    DECLARE @char unichar, @count int, @current int, @i int, @lg int,
    		@nb_ascii_chars int, @word univarchar(100)
     
    SELECT @current = 1, @count = COUNT(*)
    FROM #work 
     
    WHILE @current <= @count
    BEGIN -- For each word
    	SELECT @word = description, @lg = DATALENGTH(description)
    	FROM #work
    	WHERE cpt = @current        
     
    	SELECT @i = 1, @nb_ascii_chars = 0
    	WHILE @i <= @lg
    	BEGIN
    		SELECT @char = SUBSTRING(@word, @i, @i)
     
    		IF ASCII(@char) IS NULL                 
    			SELECT @nb_ascii_chars = @nb_ascii_chars + 2  
    		ELSE    
    			SELECT @nb_ascii_chars = @nb_ascii_chars + 1       
     
        	-- Max length of the field
        	-- 40 ASCII characters, either 20 unicode characters
    	    IF @nb_ascii_chars = 40
    	    BEGIN
    	        UPDATE #work
    	        SET description = CONVERT(univarchar(40), SUBSTRING(@word, 1, @i))
    	        WHERE cpt = @current
    	    	BREAK 
    	    END
    	    SELECT @i = @i + 1
    	END
     
    	IF @nb_ascii_chars < 40
    		UPDATE #work
            SET description = CONVERT(univarchar(40), LEFT(@word + SPACE(40), 40 - @nb_ascii_chars))
            WHERE cpt = @current
     
    	SELECT @current = @current + 1
    END 
     
    -- Final layout
    SELECT description
    	 + SPACE(3)
    	 + "---"
    FROM #work
    Mais donc j'obtiens :
    家乐酸辣汤6*20*42G+秋季菜谱 ---
    家乐香菇鸡茸汤6*20*41G+秋季菜谱 ---
    家乐四季宝颗粒花生酱340G*12 ---
    Au lieu de :
    家乐酸辣汤6*20*42G+秋季菜谱.........---
    家乐香菇鸡茸汤6*20*41G+秋季菜谱....---
    家乐四季宝颗粒花生酱340G*12.........---
    En unicode, deux caractères dans le champ


    Avez-vous une idée de comment je peux radier mes soucis d'encodage?

    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  2. #2
    Membre habitué
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Points : 168
    Points
    168
    Par défaut
    Bonjour,

    quel est le type du champ description de la table #work?
    De quel type d'application s'agit il (ctlib/dblib/jdbc) ?
    DBA sybase confirmé
    Cherche un poste sur Paris

  3. #3
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Bonjour,


    finalement j'ai contourné le problème en créant une vraie table avec la taille limite de caractères qu'il me faut et ça se passe mieux
    (en réalité c'est bien plus compliqué que ça mais l'idée est là

    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  4. #4
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Citation Envoyé par Roller Voir le message
    Bonjour,

    quel est le type du champ description de la table #work?
    De quel type d'application s'agit il (ctlib/dblib/jdbc) ?
    Le type est univarchar(21).

    Pour le type d'application, je vois pas ce que vous voulez dire...


    Désolé j'ai dé-résolu le topic car la solution n'est finalement pas du tout fiable et c'était un coup de chance sur nos premiers tests.


    Des idées sur comment aligner le tout?


    beaucoup
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  5. #5
    Membre habitué
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Points : 168
    Points
    168
    Par défaut
    Passer de univarchar a unichar...
    DBA sybase confirmé
    Cherche un poste sur Paris

  6. #6
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Citation Envoyé par Roller Voir le message
    Passer de univarchar a unichar...
    Question bête, mais quelle est la différence?
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  7. #7
    Membre habitué
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Points : 168
    Points
    168
    Par défaut
    Un exemple vaut mieux qu'un long discours:

    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
    create table test_char(col1 char(10) not null)
    insert into test_char values ('T')
    create table test_varchar(col1 varchar(10) not null)
    insert into test_varchar values ('T')
    select col1+'---' from test_char
    select col1+'---' from test_varchar
     
     -------------
     T         ---
     
    (1 row affected)
     
     -------------
     T---
     
    (1 row affected)
    ASE ajoute des espaces à droite automatiquement pour un char not null, la taille est fixe.
    DBA sybase confirmé
    Cherche un poste sur Paris

  8. #8
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Extraction champs precis
    Par HacHHacH dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 31/03/2006, 03h41
  2. UPDATE en ajoutant un 0 sur un champ de type "char"
    Par doum2 dans le forum Requêtes
    Réponses: 1
    Dernier message: 08/03/2006, 14h22

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