|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre chevronné
![]() Inscription : janvier 2006 Messages : 918 ![]() |
Bonjour
J'ai une table contenant des codes de devises de type AUD, CAD, EUR, USD, ZAR en collation CS_AI Observez bien le résultats des requêtes suivantes : select * from table where devise like '[ABC]%' : AUD, CAD select * from table where devise like '[ACZ]%' : AUD, CAD select * from table where devise like '[AZC]%' : AUD select * from table where devise like '[A-Y]%' : AUD, CAD, EUR, USD select * from table where devise like '[A-Z]%' : rien select * from table where devise like '[Z]%' : ZAR mais select * from table where devise like '[A-Z]%' COLLATE CS_AS : tout Quelqu'un saurait-il pourquoi le Z pose problème dans la requête en CS_AI ? Que faire pour résoudre ce problème ? |
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
Quelle est la collation de la colonne devise dans la table ?
C'est cela qui te guidera vers la solution. De plus la collation CS_AS n'existe pas. Il faut la langue ! A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#3 |
|
Membre chevronné
![]() Inscription : janvier 2006 Messages : 918 ![]() |
Merci de ta réponse, et au temps pour moi, j'ai été un peu rapide dans mon exposé.
La table (et le champ) sont en Latin1_General_CI_AS, et la requête fonctionne si on précise COLLATE Latin1_General_CS_AS Ce qui me surprend, c'est que la lettre Z n'a pas de raison d'être sensible aux accents, si ? |
|
|
00
|
|
|
#4 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
C'est une problématique de classement due à la lange latine dans laquelle les accents n'existent pas....
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#5 |
|
Membre chevronné
![]() Inscription : janvier 2006 Messages : 918 ![]() |
D'accord, mais pourquoi cela a-t-il un impact sur ma requête ? Je n'ai pas d'accents dans ma table, ni dans mes critères de requête.
En fait, j'aimerais surtout comprendre pourquoi je n'ai pas de résultat (ou des résultats tronqués) avec select * from table where devise like '[A-Z]%' : rien ni avec select * from table where devise like '[AZC]%' : AUD alors que j'en ai avec select * from table where devise like '[A-Y]%' : AUD, CAD, EUR, USD Se pourrait-il que le Z ait une signification particulière en Latin1_General ? |
|
|
00
|
|
|
#6 | ||
|
Nouveau Membre du Club
![]() Inscription : mai 2008 Messages : 32 ![]() |
J'ai fais le test suivant en remplaçant XXX successivement par :
Latin1_General_CI_AS Latin1_General_CS_AS Latin1_General_CI_AI Latin1_General_CS_AI Code :
Donc pour moi, tout fonctionne très bien. Désolé mais je ne vois pas d'où cela peut venir. ________________________________ Seminoque, créateur de http://www.bingokaz.com |
||
|
|
00
|
|
|
#7 |
|
Membre chevronné
![]() Inscription : janvier 2006 Messages : 918 ![]() |
Merci pour tes tests. Ton code renvoie bien la même chose que pour toi si le champ n'est pas indexé.
Par contre, si le champ devise est indexé (ou clé primaire), mon problème réapparaît, quelque soit la collation du champ (Latin1_General_CS_AI ou Latin1_General_CS_AS), mais ça marche en Latin1_General_BIN. Le fait d'indexer le champ a-t-il un impact sur la collation (collation implicite, ou un truc dans le genre ?). Ou faut-il définir la collation de l'index en plus de celle du champ ? |
|
|
00
|
|
|
#8 |
|
Expert Confirmé
![]() ![]() |
Bonjour,
Intéressant, il ne s'agit pas d'un problème de collation, mais d'un problème de plan d'exécution. Si tu as un index, SQL Server choisit un seek, avec un prédicat étrange : un between A et B ... La raison pour laquelle ça marche sans index ou avec un COLLATE, c'est à cause du scan de la table (le COLLATE force le scan). Je vais investiguer pour voir d'où ça peut venir.
__________________
Rudi Bruchez Consultant indépendant modélisation, administration, optimisation, formation, solutions MS SQL Server et informatique libre. MCDBA, MCITP, MCT, SCJP2 - http://www.babaluga.com/ Articles et tutoriels : http://rudi.developpez.com/ LIVRE : Optimiser SQL Server |
|
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() ![]() |
Le comportement est comme tu le décris en SQL Server 2005 RTM, par contre c'est correct en SP2. As-tu un service pack installé ?
__________________
Rudi Bruchez Consultant indépendant modélisation, administration, optimisation, formation, solutions MS SQL Server et informatique libre. MCDBA, MCITP, MCT, SCJP2 - http://www.babaluga.com/ Articles et tutoriels : http://rudi.developpez.com/ LIVRE : Optimiser SQL Server |
|
|
00
|
|
|
#10 |
|
Membre chevronné
![]() Inscription : janvier 2006 Messages : 918 ![]() |
Merci d'avoir cherché, c'est en effet le RTM que nous avons.
Je vais demander l'upgrade à notre admin (et allumer un cierge par la même occasion). En attendant, la clause '[ABCDE...XYZ]%' pourra toujours servir. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com