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 :

Détection d'unicode dans colonne


Sujet :

MS SQL Server

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut Détection d'unicode dans colonne
    Bonjour,

    Je veux optimiser une table. Il y a un champ description en nvarchar(). À première vue, il ne semble pas y avoir de données justifiant l'utilisation de nvarchar() plutôt que varchar().

    J'ai le contrôle du middleware donc je peux m'assurer de n'accepter que des charactères valables pour le datatype varchar().

    Ma question: quel est le moyen le plus efficace de m'assurer que le contenu actuel d'une colonne (plusieurs millions de rows) ne sera pas affecté si je modifie le data type de nvarchar() à varchar().

    Merci

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Je ne sais pas trop comment vous pouvez tester si votre colonne contient des caractères unicode de façon performante, vu le nombre de lignes que vous avez à tester.
    Le problème vient du fait que les fonctions ASCII() et UNICODE() ne renvoient que la valeur entière, telle qu'elle est définie par la norme Unicode, du premier caractère de l'expression passée en paramètre, et il n'existe pas de fonction pour tester l'existence d'un caractère unicode dans.
    Ces deux fonctions retournent des valeurs différentes pour des caractères Unicode mais la même valeur pour des caractères ASCII :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DECLARE @toto NCHAR(1)
    SET @toto = N'ส'
     
    SELECT ASCII(@toto), UNICODE(@toto)
     
    SET @toto = N'a'
     
    SELECT ASCII(@toto), UNICODE(@toto)
    Donc à part écrire une fonction qui vérifie cela pour vous, je crois qu'il n'y a pas beaucoup de choix possibles

    @++

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Le site n'affiche pas les caractère Thaïs dans le code, ce qui explique que vous ne voyez pas ส que je j'ai utilisé dans l'exemple.

    Je vous propose cette fonction :

    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
    CREATE FUNCTION Fn_CheckUnicode (@chaine NVARCHAR(MAX))
    	RETURNS BIT
    	WITH SCHEMABINDING
    AS
    BEGIN
    	DECLARE @i INT,
    			@lgr INT,
    			@caractere NCHAR(1),
    			@contientCaractereUnicode BIT
     
    	SELECT @i = 1,
    			@lgr = LEN(@chaine),
    			@contientCaractereUnicode = 0
     
    	WHILE @i <= @lgr AND @contientCaractereUnicode = 0
    	BEGIN
    		SELECT @caractere = SUBSTRING(@chaine, @i, 1)
     
    		IF ASCII(@caractere) <> UNICODE(@caractere)
    		BEGIN
    			SET @contientCaractereUnicode = 1
    		END
     
    		SET @i = @i + 1
    	END
     
    	RETURN @contientCaractereUnicode
    END
    @++

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    Ok, j'ai roulé ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DECLARE @CNT INT, @TOKEN INT, @MAX_LEN INT
    SET @CNT = 0; SET @TOKEN = 0; SELECT @MAX_LEN = MAX(LEN(username)) FROM [UBI_GATOR].[dbo].[Content] WITH (NOLOCK)
     
    PRINT '@MAX_LEN = ' + CAST(@MAX_LEN AS VARCHAR(50))
     
    WHILE @TOKEN < @MAX_LEN
    	BEGIN
    		SELECT @CNT = @CNT + ISNULL(COUNT(*), 0) FROM [Content] WITH (NOLOCK) WHERE LEN(username) >= @TOKEN AND ASCII(SUBSTRING(username, @TOKEN, 1)) <> UNICODE(SUBSTRING(username, @TOKEN, 1))
    		SET @TOKEN = @TOKEN + 1
    	END
     
    PRINT '@CNT = ' + CAST(@CNT AS VARCHAR(50))
    1,2 millions de records, 17 secondes...

    Ça vous semble correct?

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Cela n'irait pas plus vite en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT CLEF, COLONNE_UNICODE
    FROM MaTable
    EXCEPT
    SELECT CLEF, CAST(COLONNE_UNICODE AS VARCHAR(???))
    FROM MaTable
    ???

    A tester !
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. [3.0.2]Détection des erreurs dans le Package Explorer
    Par willowII dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 18/08/2005, 18h46
  2. ecriture unicode dans une mesagebox
    Par LRobi dans le forum C++
    Réponses: 1
    Dernier message: 23/02/2005, 17h23
  3. Chkbox dans colonne de flexgrid
    Par moulette85 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 07/02/2005, 16h22
  4. Comment insérer de l'unicode dans un Richedit ?
    Par DanaKil dans le forum C++Builder
    Réponses: 6
    Dernier message: 30/03/2004, 00h43
  5. Utilisation de l'unicode dans un algo de cryptage
    Par Zazeglu dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 28/10/2003, 14h38

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