Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

nchar

30 réponses
Avatar
Fred
Bonjour,
Je dois rajouter toute une série de tables dans une DB existante et dans
cette DB, les data types utilisés sont le plus souvent nvarchar (32) ou 64 ou
100. Pour les tables que je dois rajouter, c'est donc préférable que
j'utilise les mêmes ? Quel est l'avantage de ces datatypes par rapport au
varchar normal ? Performance ? On parle de Unicode sur msdn mais ça ne me
parle pas bcp ...
Pouvez-vous m'éclairer ?
Merci d'avance !

10 réponses

1 2 3
Avatar
Sylvain Lafontaine
"Fred BROUARD" wrote in message
news:%
Bonour,

Sylvain Lafontaine a écrit :
Donc et contrairement à Sylvain lafontaine qui raisonne à courte vue, il
n'est pas raisonnable d'utiliser du NATIONAL (N de CHAR ou VARCHAR
voulant dire NATIONAL) si cela n'est pas nécessaire.



Tiens, c'est bizarre, j'avais exactement le même genre d'idée: ceux qui
utilisent des varchar sans raison valable sont justement ceux qui me
semblent raisonner à courte vue.

Pour le reste, l'utilisation de l'Unicode double la taille des champs
textes mais cela correspond à une augmentation moyenne de 30% de la
taille de la BDD et peut-être à une diminution moyenne de 10% de la
performance. Autrement, avec les machines modernes, une perte de temps
complète que de tracasser à ce sujet là puisqu'une diminution de 10% de
la performance va passer totalement inaperçue chez l'utilisateur; même
s'il essaie de la mesurer avec un chrono.



Pas 30% plutôt 40 car les nombres et date occupent peu de place.
Or 40 % de volume en plus sur une base de 100 Go c'est 180 GO !



Premièrement, je ne sais pas comment vous pouvez arriver à 180 Go en
ajoutant 40% à une base 100 Go mais honnêtement, je préfère ne pas
l'apprendre (quoique à vue de nez, vous semblez avoir fait 100 + 40 + 40 =
180). Pour le reste, 30%, 40% ou même si c'était 50% de plus, qu'est-ce que
cela change? Pour la très grande majorité des utilisateurs, cela veut tout
simplement dire un peu moins d'espace vide sur leur disque dur. Pour les
quelques autres qui restent, ceux qui ont déjà un disque dur presque plein,
j'imagine que de tout façon, ils devront s'acheter un nouveau disque dur
avant longtemps si leur système est déjà proche de la saturation.

Ce qui risque cependant de ne pas passer inaperçue sera les heures, les
journées et les semaines de travail perdu en cas de problème d'encodage.
Je n'ai jamais reçu un appel ou un message de quelqu'un se plaignant de
la légère baisse de performance suite à l'utilisation de l'unicode;
cependant, pour le reste, les problèmes d'encodage pour ceux qui
utilisent l'ascii, c'est comme les taxes: il y en a partout.



C'est curieux car dans les audit que je fais, pour une dizaine d'entre eux
j'ai prouvé de sacré différence de performances par exemple pour réindexer
la base ! On passe tout simplement du simple au presque double...



Je suis d'accord avec vous que la réindexation est très lourde sur les E/S
(ou I/O en anglais) mais à moins que vos utilisateurs ne passent leur
journée à réindexer leur dbb, qu'est-ce que change ou importe? Tant qu'à
moi, le fait que la réindexation puisse prendre le double du temps ne pèse
vraiment pas lourd dans la balance. Mais bon, vous semblez être ce genre de
personne qui se promène avec un chrono à la main comme si cela était la plus
importante des choses.

Peut-être que vos clients sont super-impressionnés par le fait que la
réindexation puisse prendre le double du temps mais en ce qui me concerne,
vous n'irez pas bien loin avec cela comme argument.

Mais il est vrai que je doit manquer d'expérience puisque je ne pratique
l'audit de bases de données SQL Server que depuis une quinzaines d'années
!



Et bien dans ce cas-là, vous devriez savoir que l'on est maintenant rendu en
2009 et non plus en 1996. Les ordinateurs ont évolué depuis quinze ans. La
puissance des machines double à tous les 18 mois; le passage de l'ascii à
l'unicode correspond donc à l'équivalent de quelques mois. Je ne pense pas
que vous avez jamais dit à un client qu'il devait attendre quelques mois
avant d'acheter son nouveau système parce que sinon, il serait trop lent.

À mons avis, vous devriez arrêter de perdre votre temps avec votre chrono;
il y a des choses plus importantes dans la vie que de s'intéresser à un 10,
20 ou 30% de puissance d'un CPU ou d'une barrette de mémoire.

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************



--
Sylvain Lafontaine, ing.
MVP pour « Windows Live Platform »
Courriel: sylvain2009 sylvainlafontaine com (remplissez les blancs, svp.)
Consultant indépendant et programmation à distance pour Access et
SQL-Server.
Avatar
Fred BROUARD
Bonjour,

Sylvain Lafontaine a écrit :
"Fred BROUARD" wrote in message
news:%
Bonour,

Sylvain Lafontaine a écrit :
Donc et contrairement à Sylvain lafontaine qui raisonne à courte vue, il
n'est pas raisonnable d'utiliser du NATIONAL (N de CHAR ou VARCHAR
voulant dire NATIONAL) si cela n'est pas nécessaire.


Tiens, c'est bizarre, j'avais exactement le même genre d'idée: ceux qui
utilisent des varchar sans raison valable sont justement ceux qui me
semblent raisonner à courte vue.

Pour le reste, l'utilisation de l'Unicode double la taille des champs
textes mais cela correspond à une augmentation moyenne de 30% de la
taille de la BDD et peut-être à une diminution moyenne de 10% de la
performance. Autrement, avec les machines modernes, une perte de temps
complète que de tracasser à ce sujet là puisqu'une diminution de 10% de
la performance va passer totalement inaperçue chez l'utilisateur; même
s'il essaie de la mesurer avec un chrono.


Pas 30% plutôt 40 car les nombres et date occupent peu de place.
Or 40 % de volume en plus sur une base de 100 Go c'est 180 GO !



Premièrement, je ne sais pas comment vous pouvez arriver à 180 Go en
ajoutant 40% à une base 100 Go mais honnêtement, je préfère ne pas
l'apprendre (quoique à vue de nez, vous semblez avoir fait 100 + 40 + 40 =
180). Pour le reste, 30%, 40% ou même si c'était 50% de plus, qu'est-ce que
cela change?



visiblement vous avez du mal avec les math :
180 * 0,4 = 72
donc la base sans ces NATIONAL ferait quelque 108 Go...
Quand on parle en pourcentage on parle à partir d'un tout...


Pour la très grande majorité des utilisateurs, cela veut tout
simplement dire un peu moins d'espace vide sur leur disque dur. Pour les
quelques autres qui restent, ceux qui ont déjà un disque dur presque plein,
j'imagine que de tout façon, ils devront s'acheter un nouveau disque dur
avant longtemps si leur système est déjà proche de la saturation.



Visiblement vous ne savez pas comment fonctionne un SGBDR. Un SGBDR
travaille presque exclusivement avec la RAM. Le disque est un
épiphénomène destiné à assurer une seule fonction : celle de la
persistance des données.
Le jour ou les mémoires ne seront plus volatile (et il est proche avec
les SSD), il n'y aura plus de disque.
Or le disque freine énormément les performances. Entre une lecture
disque environ 9 ns et une lecture disque environ 9 ms, il y a un écart
intrinsèque de 1 millions !
Dans la pratique, compte tenu des bus et des caches, on parle d'un
rapport d'au moins 1000 !
Or la RAM coûte cher et vous n'allez certainement pas dire à votre
client rajoutez donc 80 Go de RAM pour assumer votre lubie inutile
d'unicode !



Ce qui risque cependant de ne pas passer inaperçue sera les heures, les
journées et les semaines de travail perdu en cas de problème d'encodage.
Je n'ai jamais reçu un appel ou un message de quelqu'un se plaignant de
la légère baisse de performance suite à l'utilisation de l'unicode;
cependant, pour le reste, les problèmes d'encodage pour ceux qui
utilisent l'ascii, c'est comme les taxes: il y en a partout.


C'est curieux car dans les audit que je fais, pour une dizaine d'entre eux
j'ai prouvé de sacré différence de performances par exemple pour réindexer
la base ! On passe tout simplement du simple au presque double...



Je suis d'accord avec vous que la réindexation est très lourde sur les E/S
(ou I/O en anglais) mais à moins que vos utilisateurs ne passent leur
journée à réindexer leur dbb, qu'est-ce que change ou importe?



Lorsque cela commence à être long, cela empiète sur le fonctionnement de
la base, pompe des ressources au détriment du service des données et
tout index en cours de réindexation est inutilisable donc les requêtes
deviennent lentes.



Tant qu'à
moi, le fait que la réindexation puisse prendre le double du temps ne pèse
vraiment pas lourd dans la balance.



Allez dire à mes clients ce genre de choses et ils vont vous rirent au
nez !!!


Mais bon, vous semblez être ce genre de
personne qui se promène avec un chrono à la main comme si cela était la plus
importante des choses.



Oui, cela s'appelle l'optimisation ! et c'est mon pain quotidien !


Peut-être que vos clients sont super-impressionnés par le fait que la
réindexation puisse prendre le double du temps mais en ce qui me concerne,
vous n'irez pas bien loin avec cela comme argument.



On croit rêver !


Mais il est vrai que je doit manquer d'expérience puisque je ne pratique
l'audit de bases de données SQL Server que depuis une quinzaines d'années
!



Et bien dans ce cas-là, vous devriez savoir que l'on est maintenant rendu en
2009 et non plus en 1996. Les ordinateurs ont évolué depuis quinze ans. La
puissance des machines double à tous les 18 mois;



Ce qui est actuellement faux et là encore visiblement vous ne maîtrisez
pas le sujet. En effet depuis quelques années les processeurs sont
bloqués à quelques 3 Ghz (en fait 5 sur les plus gros CPU) parce que au
delà, compte tenu des technologies actuelle on ne sait pas faire ! C'est
pour cela que l'on commence à faire des PC multiprocesseurs et là ça ne
sera pas du tout pareil dans les années à venir, car il va falloir
apprendre a programmer avec du code massivement parallèle...
Moore lui même dit que cette loi ne sera plus valable dans quelques
années !!!
Et prévoir c'est important en informatique, en particulier pour les
données, car on ne change pas de serveur tous les jours quant on a
plusieurs To de données !


le passage de l'ascii à
l'unicode correspond donc à l'équivalent de quelques mois. Je ne pense pas
que vous avez jamais dit à un client qu'il devait attendre quelques mois
avant d'acheter son nouveau système parce que sinon, il serait trop lent.

À mons avis, vous devriez arrêter de perdre votre temps avec votre chrono;
il y a des choses plus importantes dans la vie que de s'intéresser à un 10,
20 ou 30% de puissance d'un CPU ou d'une barrette de mémoire.



Vous dites vraiment n'importe quoi. Permettez moi de vous inviter à
suivre un cours. N'hésitez pas à vous inscrire au CNAM PACA ou je donne
le cours NFE 113 sur la modélisation des données et l'administration des
serveurs, c'est justement le cœur du sujet !

A +


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************







--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************
Avatar
Sylvain Lafontaine
"Fred BROUARD" wrote in message
news:
Bonjour,

Sylvain Lafontaine a écrit :

visiblement vous avez du mal avec les math :
180 * 0,4 = 72
donc la base sans ces NATIONAL ferait quelque 108 Go...
Quand on parle en pourcentage on parle à partir d'un tout...



Oh boy, on va faire comme à la petite école: vous avez 40 pommes vertes et
60 pommes rouges pour un total de 100 pommes, donc 40% de pommes vertes.
Vous doublez le nombre de pommes vertes; ce qui revient à rajouter 40%. On
termine donc avec un total de 100 pommes + 40 pommes = 140 pommes ou
100 + 40% = 100 * 140/100 = 100 * 1.4 = 140.

Votre 180 Go correspond à l'ajout de 80% et non pas de 40%. Cela
signifierait que l'espace occupé par les champs chaînes de caractères dans
l'espace total de la base de donnée serait de 80%; ce qui est clairement
impossible à l'exception de certains cas extrêmes; genre une seule table
avec un seul champ alphanumérique.

Visiblement vous ne savez pas comment fonctionne un SGBDR. Un SGBDR
travaille presque exclusivement avec la RAM. Le disque est un épiphénomène
destiné à assurer une seule fonction : celle de la persistance des
données.
Le jour ou les mémoires ne seront plus volatile (et il est proche avec les
SSD), il n'y aura plus de disque.
Or le disque freine énormément les performances. Entre une lecture disque
environ 9 ns et une lecture disque environ 9 ms, il y a un écart
intrinsèque de 1 millions !
Dans la pratique, compte tenu des bus et des caches, on parle d'un rapport
d'au moins 1000 !
Or la RAM coûte cher et vous n'allez certainement pas dire à votre client
rajoutez donc 80 Go de RAM pour assumer votre lubie inutile d'unicode !



Ma lubie semble maintenant être répandue partout: le système d'exploitation
Windows travaille maintenant presque exclusivement à l'interne en unicode;
les bases de données Access sont maintenant exclusivement en unicode depuis
plusieurs versions et le plateforme (framework) .NET est elle aussi presque
exclusivement en unicode.

Allez dire à mes clients ce genre de choses et ils vont vous rirent au nez
!!!



Je ne sais pas s'ils vont me rire au nez mais je peux vous dire que quand
quelqu'un vous appelle pour dire qu'il se retrouve avec un problème
d'encodage dans sa bdd, il se met à rire jaune entre ses dents quand il
apprend qu'il n'y a pas de solution non-coûteuse pour corriger son problème
et quand plus, même après avoir corrigé le problème, il risque fort de
rester avec des données corrompues pour les données déjà entrées.

Ils s'attendent toujours à ce qu'on leur dise que tout ce qu'il y a à faire,
c'est de cliquer à un endroit et le problème va disparaître de lui-même et
non pas à apprendre qu'ils risquent fort de se retrouver avec une note salée
à la place pour corriger le problème.

Comme on dit: économiser un peu maintenant, payer cher plus tard.
Vous dites vraiment n'importe quoi. Permettez moi de vous inviter à suivre
un cours. N'hésitez pas à vous inscrire au CNAM PACA ou je donne le cours
NFE 113 sur la modélisation des données et l'administration des serveurs,
c'est justement le cœur du sujet !



J'espère que ce n'est pas vous qui montre à ces étudiants comment calculer
les pourcentages. Pour le reste, ne vous en faites pas; le fait que vous
donniez des cours me laisse complètement froid comme argument.

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************







--
Sylvain Lafontaine, ing.
MVP pour « Windows Live Platform »
Courriel: sylvain2009 sylvainlafontaine com (remplissez les blancs, svp.)
Consultant indépendant et programmation à distance pour Access et
SQL-Server.
Avatar
Pierre Goiffon
Sylvain Lafontaine wrote:
Je ne sais pas s'ils vont me rire au nez mais je peux vous dire que quand
quelqu'un vous appelle pour dire qu'il se retrouve avec un problème
d'encodage dans sa bdd, il se met à rire jaune entre ses dents quand il
apprend qu'il n'y a pas de solution non-coûteuse pour corriger son problème
et quand plus, même après avoir corrigé le problème, il risque fort de
rester avec des données corrompues pour les données déjà entrées.



Bonjour,
J'ai lu ce fil avec intérêt. J'ai beaucoup de questions en tête... Car
pas les idées très claires sur le sujet. Je précise que j'ai massivement
développé avec SQL Server 7 et 2000, mais que je n'y ai depuis 5 ans
touché qu'à (malheureusement) grande distance.

D'abord une réflexion qui me vient rapidement en lisant vos arguments :
il est quand même très répandu par ici qu'une base ne stocke que des
données en scripts latins. Utiliser Unicode dans ce cas est plutôt
"overkill", même avec les machines d'aujourd'hui ! Car nous parlons bien
de serveur de bdd d'entreprise, pour lesquels ont essaie de tenir le
plus juste compromis, qui sont donc des machines puissantes mais que
l'on a choisit pour les exploiter à leur plus juste potentiel.
Bref, si passer à un stockage tout Unicode n'avait aucune conséquence
sur la consommation de ressources, ok, mais ce n'est pas du tout le cas
(retour de Fred et de nombreux collègues sur le sujet). Se poser la
question me parait donc être un minimum. A voir ensuite suivant le
contexte particulier pour prendre sa décision...

Pour les questions : je ne comprend pas le lien entre collation et
champs nchar / nvarchar ? Il n'existe pas de collation assurant un
stockage en Unicode, Utf-8 ou 16 ? On doit donc définir une certaine
collation sur un charset 8 bits, et utiliser des champs nchar / nvarchar
si l'on souhaite stocker des données dans plusieurs scripts ?

Ensuite, comment gérer les autres critères de la collation (tri,
comparaison) lorsque l'on a dans une même colonne des données dans de
nombreux scripts ? Par exemple, peut-on obtenir un ordre de tri pour
telle famille de scripts, tel autre pour un autre, ... Ou faut-il alors
plutôt envisager un stockage dans une table par collation ? Dans ce cas,
quel est l'intérêt dans la réalité d'un champ nchar / nvarchar ?
Avatar
Sylvain Lafontaine
"Pierre Goiffon" wrote in message
news:4ac1e204$0$297$
Sylvain Lafontaine wrote:
Je ne sais pas s'ils vont me rire au nez mais je peux vous dire que quand
quelqu'un vous appelle pour dire qu'il se retrouve avec un problème
d'encodage dans sa bdd, il se met à rire jaune entre ses dents quand il
apprend qu'il n'y a pas de solution non-coûteuse pour corriger son
problème et quand plus, même après avoir corrigé le problème, il risque
fort de rester avec des données corrompues pour les données déjà entrées.



Bonjour,
J'ai lu ce fil avec intérêt. J'ai beaucoup de questions en tête... Car pas
les idées très claires sur le sujet. Je précise que j'ai massivement
développé avec SQL Server 7 et 2000, mais que je n'y ai depuis 5 ans
touché qu'à (malheureusement) grande distance.

D'abord une réflexion qui me vient rapidement en lisant vos arguments : il
est quand même très répandu par ici qu'une base ne stocke que des données
en scripts latins. Utiliser Unicode dans ce cas est plutôt "overkill",
même avec les machines d'aujourd'hui ! Car nous parlons bien de serveur de
bdd d'entreprise, pour lesquels ont essaie de tenir le plus juste
compromis, qui sont donc des machines puissantes mais que l'on a choisit
pour les exploiter à leur plus juste potentiel.



Même si vous ne stocker que des scripts latins et excluant par le fait tout
caractère étranger (grec, russe, etc.), vous pouvez quand même être frappé
par un problème d'encodage dû à un problème de communication avec une
application client et c'est quelque chose que j'ai vu souvent par le passé.
Si votre système est complètement fermé, que vous avez un contrôle absolu
dessus non seulement sur le serveur mais également sur toutes les machines
et applications clients qui se connecteront avec et que vous pouvez garantir
que cela restera de même, alors là, pas de problème. Vous vivez dans une
bulle hermétiquement fermée, vou êtes heureux et rien en ce bas monde ne
peut vous toucher.

Le problème c'est que c'est bien souvent loin d'être le cas. Par example,
il y a deux codepages par machine windows: l'OEM, qui correspond au codepage
DOS classique et le codepage Windows. Même si vous choisissez le codepage
français dans les deux cas, ces deux codepages ne seront pas identiques pour
les lettres accentuées et pourront vous causer des problèmes d'encodage si
une application client quelconque utilise l'OEM ou utilise le codepage
Windows mais que ce dernier est différent de celui défini sur le serveur.

Les protocols étant imparfaits, vous pouvez vous retrouver avec des
problèmes d'encodage même dans les cas où vous stockerez uniquement des
caractères français si votre système n'est pas à 100% fermé. L'accès à
votre serveur par des machines utilisant d'autres codepages (codepages non
français ou mix de codepages OEM vs Windows) peut donner des résultats
incorrects même dans les cas où les caractères français sont utilisés
exclusivement. C'était le cas voilà maintenant quelques années. Peut-être
que ce n'est plus vrai aujourd'hui mais personnellement, j'ai tellement
perdu de temps les années passées pour résoudre des problèmes d'encodage que
je ne suis plus vraiment intéressé à regarder de nouveau la question;
surtout sachant que la puissance des machines double à tous les 18 mois pour
un prix équivalent.

Évidemment, ils y a ceux qui gèrent de très gros systèmes et pour qui le
passage à l'unicode peut représenter une augmentation significative de coûts
parce que leur système travaille déjà à saturation et qu'ils ne prévoient
pas avoir à supporter autre chose que le français dans un avenir
prévisible - ou qu'ils s'en foutent de ne pas supporter autre chose même si
cela pourrait leur être avantageux - et qu'ils ne prévoient pas interfacer
avec autre chose que des applications-clients ayant strictement le même
codepage qu'eux. Pour eux, cela peut être une décision raisonnable ou un
risque calculé que de s'en tenir au code Ascii. Cependant, s'ils se
trompent, les économies réalisées au début vont fondre plus vite que neige
au soleil et ils risquent de regretter amèrement leur décision par la suite.
C'est pourquoi, avant de prendre cette décision, il faut vraiment savoir où
l'on s'en va et ne pas regarder la question uniquement sous l'aspect
économie de CPU/barrette de mémoire/espace disque. La puissance des
machines double à tous les 18 mois; le coût du programmeur, lui, ne diminue
pas. En fait, dans le cas du programmeur, c'est le contraire qui se passe:
s'il y a une erreur dans le choix de l'Ascii/Unicode, plus vous aller
attendre longtemps avant de corriger l'erreur, plus elle va vous coûter cher
à corriger.

Bref, si passer à un stockage tout Unicode n'avait aucune conséquence sur
la consommation de ressources, ok, mais ce n'est pas du tout le cas
(retour de Fred et de nombreux collègues sur le sujet). Se poser la
question me parait donc être un minimum. A voir ensuite suivant le
contexte particulier pour prendre sa décision...



C'est certain qu'il y a une consommation supplémentaire de ressources mais
dans la plupart des cas, cela va passer totalement inaperçu du côté de
l'application client. Dans les cas où vous avez à gérer un gros système
travaillant proche de son point de saturation; c'est-à-dire un système pour
lequel il n'y plus de ressource en réserve de disponible; l'utilisation de
l'Ascii peut être une solution appropriée. Cependant, s'il s'avère à la
longue que cette décision est erronée, la corriger par la suite peut
s'avérer très coûteuse et même beaucoup, beaucoup plus coûteuse que
l'économie initiale. C'est pourquoi avant de prendre cette décision, il
faut vraiment savoir où est-ce que l'on s'en va et ne pas regarder la
question uniquement sous l'aspect économie de CPU/barrette de mémoire/espace
disque. Comme je l'ai dit plus haut, le coût des CPUs, de la RAM et de
l'espace disque diminue à chaque année, sinon à chaque mois. Celui du
programmeur, lui, ne diminue pas et tends même à augmenter avec l'âge d'une
application: cela ne coûte presque rien en temps de programmation si l'on
choisit l'unicode au départ mais par la suite; si l'on doit prendre la
décision de convertir une application de l'ascii à l'unicode, cela risque de
coûter de plus en plus cher avec l'âge de l'application et peut même devenir
extrêmement dispendieux.

Parlez-en à ceux qui non seulement ont dû convertir leur application mais
qui en plus, doivent maintenant maintenir les deux versions - avec tout ce
que cela entraîne comme trouble supplémentaire - parce que certains de leurs
clients ont refusé de changer une application déjà testée, approuvée et
déployée dans leur compagnie.

Pour les questions : je ne comprend pas le lien entre collation et champs
nchar / nvarchar ? Il n'existe pas de collation assurant un stockage en
Unicode, Utf-8 ou 16 ? On doit donc définir une certaine collation sur un
charset 8 bits, et utiliser des champs nchar / nvarchar si l'on souhaite
stocker des données dans plusieurs scripts ?



La collation n'est pas associée au stockage des caractères mais à leur
interprétation: tri ou/et égalité de caractères qui peuvent apparaître à
première vue différent mais qui ne le sont pas dans un language particulier.
Par example, en espagnol ancien, les lettres latines "ll" représentent en
fait une lettre différente et doivent être triés après "lz" mais avant "la".
Même chose pour "ch". Aujourd'hui, cependant, seul la lettre "ñ" doit être
triée après "nz". En allemand, les lettres "ß" et "ss" (en minuscule)
s'équivalent, de même que le remplacement d'un tréma par l'ajout de un "e":

select
case when N'ß' = N'ss' then 1 else 0 end as t1,
case when N'ß' = N'ss' collate Latin1_General_CS_AI then 1 else 0 end as
t2,
case when N'ß' = N'SS' collate Latin1_General_CS_AI then 1 else 0 end as
t3,
case when N'ß' = N'ss' collate Latin1_general_bin then 1 else 0 end as t4,
case when N'Mädchen' = N'Maedchen' collate Latin1_General_CI_AI then 1 else
0 end as t5,
case when N'Mädchen' = N'Maedchen' collate German_PhoneBook_CI_AI then 1
else 0 end as t6


En français, on doit trier les accents en commençant par la fin du mot et
non pas par le début, de sorte que "côte" doit être triée avant "coté":

select s from (
select N'cote' as s
union all select N'coté'
union all select N'côte'
union all select N'côté'
) as q
order by s collate french_ci_as

donne:

cote
côte
coté
côté

tandis que l'utilisation de la collation 1252 du code ascii 8 bits va
donner:

select s from (
select N'cote' as s
union all select N'coté'
union all select N'côte'
union all select N'côté'
) as q
order by s collate SQL_Latin1_General_Cp1_ci_as

avec comme résultat:

cote
coté
côte
côté

ce qui est incorrect en français standard. D'autres languages utilisant
l'alphabet latins ont des règles de tri et d'équivalence beaucoup plus
complexes que le français, l'allemand ou l'espagnol.

Ensuite, comment gérer les autres critères de la collation (tri,
comparaison) lorsque l'on a dans une même colonne des données dans de
nombreux scripts ? Par exemple, peut-on obtenir un ordre de tri pour telle
famille de scripts, tel autre pour un autre, ... Ou faut-il alors plutôt
envisager un stockage dans une table par collation ? Dans ce cas, quel est
l'intérêt dans la réalité d'un champ nchar / nvarchar ?



Je n'ai absolument aucune idée de ce que vous voulez dire ici. Désolé.

--
Sylvain Lafontaine, ing.
MVP pour « Windows Live Platform »
Courriel: sylvain2009 sylvainlafontaine com (remplissez les blancs, svp.)
Consultant indépendant et programmation à distance pour Access et
SQL-Server.
Avatar
Pierre Goiffon
Sylvain Lafontaine wrote:
D'abord une réflexion qui me vient rapidement en lisant vos arguments : il
est quand même très répandu par ici qu'une base ne stocke que des données
en scripts latins. Utiliser Unicode dans ce cas est plutôt "overkill"



Même si vous ne stocker que des scripts latins et excluant par le fait tout
caractère étranger (grec, russe, etc.), vous pouvez quand même être frappé
par un problème d'encodage dû à un problème de communication avec une
application client et c'est quelque chose que j'ai vu souvent par le passé.


(...)
Le problème c'est que c'est bien souvent loin d'être le cas. Par example,
il y a deux codepages par machine windows: l'OEM, qui correspond au codepage
DOS classique et le codepage Windows.



Je ne comprend pas cet argument : dans tous les cas, vous devez
contrôler ces 2 points :
- stockage dans la base de données
- charset utilisé par l'application client dans sa connexion à la BDD
+ tout le reste de la chaine jusqu'à la couche présentation...

Tout passer en Unicode ne permet pas de s'affranchir de cela, ou quelque
chose m'échappe ?!!??

Les notions de codage sont la plupart du temps survolées par les
développeurs, qui se disent "j'ai lu qu'il fallait passer en Unicode
pour résoudre le prb" et ne cherchent pas à aller plus loin. Résoudre un
prb sans comprendre sa cause et avec une manip dont on ne saisit pas les
tenants et aboutissants me parait plus que dangereux !

Mais je vous ai peut être mal compris ?

Évidemment, ils y a ceux qui gèrent de très gros systèmes et pour qui le
passage à l'unicode peut représenter une augmentation significative de coûts
parce que leur système travaille déjà à saturation et qu'ils ne prévoient
pas avoir à supporter autre chose que le français dans un avenir
prévisible - ou qu'ils s'en foutent de ne pas supporter autre chose même si
cela pourrait leur être avantageux - et qu'ils ne prévoient pas interfacer
avec autre chose que des applications-clients ayant strictement le même
codepage qu'eux. Pour eux, cela peut être une décision raisonnable ou un
risque calculé que de s'en tenir au code Ascii. Cependant, s'ils se
trompent, les économies réalisées au début vont fondre plus vite que neige
au soleil et ils risquent de regretter amèrement leur décision par la suite.
C'est pourquoi, avant de prendre cette décision, il faut vraiment savoir où
l'on s'en va et ne pas regarder la question uniquement sous l'aspect
économie de CPU/barrette de mémoire/espace disque. La puissance des
machines double à tous les 18 mois; le coût du programmeur, lui, ne diminue
pas. En fait, dans le cas du programmeur, c'est le contraire qui se passe:
s'il y a une erreur dans le choix de l'Ascii/Unicode, plus vous aller
attendre longtemps avant de corriger l'erreur, plus elle va vous coûter cher
à corriger.



Trois choses après vous avoir lu :

- Des serveurs SQL Server qui sont dimensionné au plus juste, de mon
expérience c'est le cas très largement général... Les machines sont de
plus en plus puissantes, mais les consommations suivent très fidèlement
cette courbe de croissance : en 12 ans d'expérience professionnelle, je
vois toujours autant de prb de performance.

- Si je parlais de scripts latins, c'était pour faire référence à ISO
Latin-9 (iso 8859-15) ou Windows-1252, deux charset 8 bits qui
permettent de stocker toutes les langues d'Europe de l'Ouest. Donc bien
plus que le seul français ! Et on ne peut quand même dire sans se
tromper que la plupart des applications par chez nous (dans les
entreprises françaises) n'ont pas à stocker bien plus... Mais je vous
rejoins évidemment sur le choix à la conception, qui doit être bien
raisonné !
Par ailleurs, parler comme vous le faite "d'ASCII", qui fait en général
référence à us-ascii et donc un charset 7 bits, porte donc assez à
confusion.

- Corriger l'erreur : cela fait partie de mes interrogations... Si l'on
a à modifier le stockage d'une bdd SQL Server vers de l'Unicode,
qu'est-ce que cela va impliquer comme opération ? N'est-ce pas une
"simple" conversion, qui va juste entraîner un arrêt de service le temps
qu'elle prendra ? Les contenus précédents pouvant être recodés en
Unicode, et les anciennes applications clientes se connectant toujours
avec le charset précédent. (pas compris pourquoi vous parliez de "2
versions" ?)
C'est aussi entre autre pourquoi je ne comprend pas la différence entre
ces champs nchar et la collation... on y arrive juste en-dessous.

Pour les questions : je ne comprend pas le lien entre collation et champs
nchar / nvarchar ?



La collation n'est pas associée au stockage des caractères mais à leur
interprétation: tri ou/et égalité de caractères



De ce que j'en avais retenu la collation en bdd regroupait les 3 notions :
- codage au stockage
- comparaison
- tri

Par quel paramètre indique-t-on alors dans quel codage stocker les
champs textes char, varchar ? Est-ce figé à un codage non modifiable, ce
qui expliquerait l'existence de ces nchar et nvarchar ? Donc le choix
entre un codage par défaut ou Unicode ? (que je suppose être UTF-16 ?)

Je viens de revérifier, il y avait bien des noms laissant à penser à des
codage dans les collation sur SQL Server 2000 : sur
http://msdn.microsoft.com/en-us/library/aa226047%28SQL.80%29.aspx par
exemple Latin1_General est marqué comme stocké en "1252" (ce qui laisse
à penser qu'il s'agit de Windows-1252)

(...)
avec comme résultat:

cote
coté
côte
côté

ce qui est incorrect en français standard. D'autres languages utilisant
l'alphabet latins ont des règles de tri et d'équivalence beaucoup plus
complexes que le français, l'allemand ou l'espagnol.



C'était exactement le sens de ma question :

Ensuite, comment gérer les autres critères de la collation (tri,
comparaison) lorsque l'on a dans une même colonne des données dans de
nombreux scripts ? Par exemple, peut-on obtenir un ordre de tri pour telle
famille de scripts, tel autre pour un autre, ... Ou faut-il alors plutôt
envisager un stockage dans une table par collation ? Dans ce cas, quel est
l'intérêt dans la réalité d'un champ nchar / nvarchar ?





Si l'on a à gérer plusieurs langues au sein d'une même table, il est à
parier que suivant le contexte on aura besoin une fois d'un tri ou d'une
égalité donc d'une certaine collation, une autre fois d'une autre...

Comment est-ce que l'on peut gérer ça requête à requête ? On peut en
effet imaginer sans peine avoir besoin d'un ordre de tri et comparaison
donné pour une langue A, et des paramètres tout autres pour une langue
B. Si tout est stocké dans la même table... Est-ce que l'on peut définir
un "profil" que l'on pourr aindiquer à chaque requête ? Ou la collation
s'applique forcément à une colonne ? Une table ? Dans ce cas il faudra
soit créer plusieurs colonnes soit plusieurs tables...

Bref, profiter d'Unicode pour pouvoir stocker tous les scripts du monde
c'est bien, mais dans la pratique on peut imaginer rencontrer ce genre
de prb bloquants entre plusieurs langues que l'on doit gérer...
Avatar
Fred BROUARD
En 20 ans de bases de données et en près de 15 avec SQL Server, je n'ais
eut qu'une seule fois l'obligation de passer toute la base en UNICODE
parce que le cahier des charges précisait : "une personne peut commander
un service en japonais sur le site et avoir ce service à sa descente
d'avion à New York ce qui suppose que dans les mêmes tables de la base
différentes langues du monde entier seront utilisées."

Dans tous les autres cas :
- ASCII pour les langues latines
- UNICODE pour les langues idéographique
donc au coup par coup à l'installation ce que l'utilisation de DOMAINES
SQL permet facilement par redéfinition des domaines à la création de la
base.

A +

Pierre Goiffon a écrit :
Sylvain Lafontaine wrote:
D'abord une réflexion qui me vient rapidement en lisant vos arguments
: il est quand même très répandu par ici qu'une base ne stocke que
des données en scripts latins. Utiliser Unicode dans ce cas est
plutôt "overkill"



Même si vous ne stocker que des scripts latins et excluant par le fait
tout caractère étranger (grec, russe, etc.), vous pouvez quand même
être frappé par un problème d'encodage dû à un problème de
communication avec une application client et c'est quelque chose que
j'ai vu souvent par le passé.


(...)
Le problème c'est que c'est bien souvent loin d'être le cas. Par
example, il y a deux codepages par machine windows: l'OEM, qui
correspond au codepage DOS classique et le codepage Windows.



Je ne comprend pas cet argument : dans tous les cas, vous devez
contrôler ces 2 points :
- stockage dans la base de données
- charset utilisé par l'application client dans sa connexion à la BDD
+ tout le reste de la chaine jusqu'à la couche présentation...

Tout passer en Unicode ne permet pas de s'affranchir de cela, ou quelque
chose m'échappe ?!!??

Les notions de codage sont la plupart du temps survolées par les
développeurs, qui se disent "j'ai lu qu'il fallait passer en Unicode
pour résoudre le prb" et ne cherchent pas à aller plus loin. Résoudre un
prb sans comprendre sa cause et avec une manip dont on ne saisit pas les
tenants et aboutissants me parait plus que dangereux !

Mais je vous ai peut être mal compris ?

Évidemment, ils y a ceux qui gèrent de très gros systèmes et pour qui
le passage à l'unicode peut représenter une augmentation significative
de coûts parce que leur système travaille déjà à saturation et qu'ils
ne prévoient pas avoir à supporter autre chose que le français dans un
avenir prévisible - ou qu'ils s'en foutent de ne pas supporter autre
chose même si cela pourrait leur être avantageux - et qu'ils ne
prévoient pas interfacer avec autre chose que des applications-clients
ayant strictement le même codepage qu'eux. Pour eux, cela peut être
une décision raisonnable ou un risque calculé que de s'en tenir au
code Ascii. Cependant, s'ils se trompent, les économies réalisées au
début vont fondre plus vite que neige au soleil et ils risquent de
regretter amèrement leur décision par la suite. C'est pourquoi, avant
de prendre cette décision, il faut vraiment savoir où l'on s'en va et
ne pas regarder la question uniquement sous l'aspect économie de
CPU/barrette de mémoire/espace disque. La puissance des machines
double à tous les 18 mois; le coût du programmeur, lui, ne diminue
pas. En fait, dans le cas du programmeur, c'est le contraire qui se
passe: s'il y a une erreur dans le choix de l'Ascii/Unicode, plus vous
aller attendre longtemps avant de corriger l'erreur, plus elle va vous
coûter cher à corriger.



Trois choses après vous avoir lu :

- Des serveurs SQL Server qui sont dimensionné au plus juste, de mon
expérience c'est le cas très largement général... Les machines sont de
plus en plus puissantes, mais les consommations suivent très fidèlement
cette courbe de croissance : en 12 ans d'expérience professionnelle, je
vois toujours autant de prb de performance.

- Si je parlais de scripts latins, c'était pour faire référence à ISO
Latin-9 (iso 8859-15) ou Windows-1252, deux charset 8 bits qui
permettent de stocker toutes les langues d'Europe de l'Ouest. Donc bien
plus que le seul français ! Et on ne peut quand même dire sans se
tromper que la plupart des applications par chez nous (dans les
entreprises françaises) n'ont pas à stocker bien plus... Mais je vous
rejoins évidemment sur le choix à la conception, qui doit être bien
raisonné !
Par ailleurs, parler comme vous le faite "d'ASCII", qui fait en général
référence à us-ascii et donc un charset 7 bits, porte donc assez à
confusion.

- Corriger l'erreur : cela fait partie de mes interrogations... Si l'on
a à modifier le stockage d'une bdd SQL Server vers de l'Unicode,
qu'est-ce que cela va impliquer comme opération ? N'est-ce pas une
"simple" conversion, qui va juste entraîner un arrêt de service le temps
qu'elle prendra ? Les contenus précédents pouvant être recodés en
Unicode, et les anciennes applications clientes se connectant toujours
avec le charset précédent. (pas compris pourquoi vous parliez de "2
versions" ?)
C'est aussi entre autre pourquoi je ne comprend pas la différence entre
ces champs nchar et la collation... on y arrive juste en-dessous.

Pour les questions : je ne comprend pas le lien entre collation et
champs nchar / nvarchar ?



La collation n'est pas associée au stockage des caractères mais à leur
interprétation: tri ou/et égalité de caractères



De ce que j'en avais retenu la collation en bdd regroupait les 3 notions :
- codage au stockage
- comparaison
- tri

Par quel paramètre indique-t-on alors dans quel codage stocker les
champs textes char, varchar ? Est-ce figé à un codage non modifiable, ce
qui expliquerait l'existence de ces nchar et nvarchar ? Donc le choix
entre un codage par défaut ou Unicode ? (que je suppose être UTF-16 ?)

Je viens de revérifier, il y avait bien des noms laissant à penser à des
codage dans les collation sur SQL Server 2000 : sur
http://msdn.microsoft.com/en-us/library/aa226047%28SQL.80%29.aspx par
exemple Latin1_General est marqué comme stocké en "1252" (ce qui laisse
à penser qu'il s'agit de Windows-1252)

(...)
avec comme résultat:

cote
coté
côte
côté

ce qui est incorrect en français standard. D'autres languages
utilisant l'alphabet latins ont des règles de tri et d'équivalence
beaucoup plus complexes que le français, l'allemand ou l'espagnol.



C'était exactement le sens de ma question :

Ensuite, comment gérer les autres critères de la collation (tri,
comparaison) lorsque l'on a dans une même colonne des données dans de
nombreux scripts ? Par exemple, peut-on obtenir un ordre de tri pour
telle famille de scripts, tel autre pour un autre, ... Ou faut-il
alors plutôt envisager un stockage dans une table par collation ?
Dans ce cas, quel est l'intérêt dans la réalité d'un champ nchar /
nvarchar ?





Si l'on a à gérer plusieurs langues au sein d'une même table, il est à
parier que suivant le contexte on aura besoin une fois d'un tri ou d'une
égalité donc d'une certaine collation, une autre fois d'une autre...

Comment est-ce que l'on peut gérer ça requête à requête ? On peut en
effet imaginer sans peine avoir besoin d'un ordre de tri et comparaison
donné pour une langue A, et des paramètres tout autres pour une langue
B. Si tout est stocké dans la même table... Est-ce que l'on peut définir
un "profil" que l'on pourr aindiquer à chaque requête ? Ou la collation
s'applique forcément à une colonne ? Une table ? Dans ce cas il faudra
soit créer plusieurs colonnes soit plusieurs tables...

Bref, profiter d'Unicode pour pouvoir stocker tous les scripts du monde
c'est bien, mais dans la pratique on peut imaginer rencontrer ce genre
de prb bloquants entre plusieurs langues que l'on doit gérer...




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************
Avatar
Med Bouchenafa
Voici ce que Microsoft dit sur le sujet
http://msdn.microsoft.com/en-us/library/ee240835%28SQL.105%29.aspx

Il est cependant certain que l'espace peut-etre est un probleme dans
certains cas.
Sinon comment expliquer que SQL Server 2008 R2 apporte comme nouveauté la
compression Unicode
http://msdn.microsoft.com/en-us/library/ms189617.aspx

Il est vrai que ces dernieres années, la tension s'est largement relachée
sur les performances avec la puissance materielle des serveurs
J'ai vu beaucoup prendre la decision de passer tout en Unicode.
Pourquoi pas?
Mais moi, je continue, comme avant, á utiliser le deux
Unicode ou pas Unicode, c'est fondamentalement le business qui decide en
premier
Je me vois mal codifier une colonne Sex avec NCHAR(1) ( Exemple reel chez un
client)

Mais bon,

Bien cordialement
Med Bouchenafa

"Fred BROUARD" wrote in message
news:#
En 20 ans de bases de données et en près de 15 avec SQL Server, je n'ais
eut qu'une seule fois l'obligation de passer toute la base en UNICODE
parce que le cahier des charges précisait : "une personne peut commander
un service en japonais sur le site et avoir ce service à sa descente
d'avion à New York ce qui suppose que dans les mêmes tables de la base
différentes langues du monde entier seront utilisées."

Dans tous les autres cas :
- ASCII pour les langues latines
- UNICODE pour les langues idéographique
donc au coup par coup à l'installation ce que l'utilisation de DOMAINES
SQL permet facilement par redéfinition des domaines à la création de la
base.

A +

Pierre Goiffon a écrit :
Sylvain Lafontaine wrote:
D'abord une réflexion qui me vient rapidement en lisant vos arguments :
il est quand même très répandu par ici qu'une base ne stocke que des
données en scripts latins. Utiliser Unicode dans ce cas est plutôt
"overkill"



Même si vous ne stocker que des scripts latins et excluant par le fait
tout caractère étranger (grec, russe, etc.), vous pouvez quand même être
frappé par un problème d'encodage dû à un problème de communication avec
une application client et c'est quelque chose que j'ai vu souvent par le
passé.


(...)
Le problème c'est que c'est bien souvent loin d'être le cas. Par
example, il y a deux codepages par machine windows: l'OEM, qui
correspond au codepage DOS classique et le codepage Windows.



Je ne comprend pas cet argument : dans tous les cas, vous devez contrôler
ces 2 points :
- stockage dans la base de données
- charset utilisé par l'application client dans sa connexion à la BDD
+ tout le reste de la chaine jusqu'à la couche présentation...

Tout passer en Unicode ne permet pas de s'affranchir de cela, ou quelque
chose m'échappe ?!!??

Les notions de codage sont la plupart du temps survolées par les
développeurs, qui se disent "j'ai lu qu'il fallait passer en Unicode pour
résoudre le prb" et ne cherchent pas à aller plus loin. Résoudre un prb
sans comprendre sa cause et avec une manip dont on ne saisit pas les
tenants et aboutissants me parait plus que dangereux !

Mais je vous ai peut être mal compris ?

Évidemment, ils y a ceux qui gèrent de très gros systèmes et pour qui le
passage à l'unicode peut représenter une augmentation significative de
coûts parce que leur système travaille déjà à saturation et qu'ils ne
prévoient pas avoir à supporter autre chose que le français dans un
avenir prévisible - ou qu'ils s'en foutent de ne pas supporter autre
chose même si cela pourrait leur être avantageux - et qu'ils ne
prévoient pas interfacer avec autre chose que des applications-clients
ayant strictement le même codepage qu'eux. Pour eux, cela peut être une
décision raisonnable ou un risque calculé que de s'en tenir au code
Ascii. Cependant, s'ils se trompent, les économies réalisées au début
vont fondre plus vite que neige au soleil et ils risquent de regretter
amèrement leur décision par la suite. C'est pourquoi, avant de prendre
cette décision, il faut vraiment savoir où l'on s'en va et ne pas
regarder la question uniquement sous l'aspect économie de CPU/barrette
de mémoire/espace disque. La puissance des machines double à tous les
18 mois; le coût du programmeur, lui, ne diminue pas. En fait, dans le
cas du programmeur, c'est le contraire qui se passe: s'il y a une erreur
dans le choix de l'Ascii/Unicode, plus vous aller attendre longtemps
avant de corriger l'erreur, plus elle va vous coûter cher à corriger.



Trois choses après vous avoir lu :

- Des serveurs SQL Server qui sont dimensionné au plus juste, de mon
expérience c'est le cas très largement général... Les machines sont de
plus en plus puissantes, mais les consommations suivent très fidèlement
cette courbe de croissance : en 12 ans d'expérience professionnelle, je
vois toujours autant de prb de performance.

- Si je parlais de scripts latins, c'était pour faire référence à ISO
Latin-9 (iso 8859-15) ou Windows-1252, deux charset 8 bits qui permettent
de stocker toutes les langues d'Europe de l'Ouest. Donc bien plus que le
seul français ! Et on ne peut quand même dire sans se tromper que la
plupart des applications par chez nous (dans les entreprises françaises)
n'ont pas à stocker bien plus... Mais je vous rejoins évidemment sur le
choix à la conception, qui doit être bien raisonné !
Par ailleurs, parler comme vous le faite "d'ASCII", qui fait en général
référence à us-ascii et donc un charset 7 bits, porte donc assez à
confusion.

- Corriger l'erreur : cela fait partie de mes interrogations... Si l'on a
à modifier le stockage d'une bdd SQL Server vers de l'Unicode, qu'est-ce
que cela va impliquer comme opération ? N'est-ce pas une "simple"
conversion, qui va juste entraîner un arrêt de service le temps qu'elle
prendra ? Les contenus précédents pouvant être recodés en Unicode, et les
anciennes applications clientes se connectant toujours avec le charset
précédent. (pas compris pourquoi vous parliez de "2 versions" ?)
C'est aussi entre autre pourquoi je ne comprend pas la différence entre
ces champs nchar et la collation... on y arrive juste en-dessous.

Pour les questions : je ne comprend pas le lien entre collation et
champs nchar / nvarchar ?



La collation n'est pas associée au stockage des caractères mais à leur
interprétation: tri ou/et égalité de caractères



De ce que j'en avais retenu la collation en bdd regroupait les 3 notions
:
- codage au stockage
- comparaison
- tri

Par quel paramètre indique-t-on alors dans quel codage stocker les champs
textes char, varchar ? Est-ce figé à un codage non modifiable, ce qui
expliquerait l'existence de ces nchar et nvarchar ? Donc le choix entre
un codage par défaut ou Unicode ? (que je suppose être UTF-16 ?)

Je viens de revérifier, il y avait bien des noms laissant à penser à des
codage dans les collation sur SQL Server 2000 : sur
http://msdn.microsoft.com/en-us/library/aa226047%28SQL.80%29.aspx par
exemple Latin1_General est marqué comme stocké en "1252" (ce qui laisse à
penser qu'il s'agit de Windows-1252)

(...)
avec comme résultat:

cote
coté
côte
côté

ce qui est incorrect en français standard. D'autres languages utilisant
l'alphabet latins ont des règles de tri et d'équivalence beaucoup plus
complexes que le français, l'allemand ou l'espagnol.



C'était exactement le sens de ma question :

Ensuite, comment gérer les autres critères de la collation (tri,
comparaison) lorsque l'on a dans une même colonne des données dans de
nombreux scripts ? Par exemple, peut-on obtenir un ordre de tri pour
telle famille de scripts, tel autre pour un autre, ... Ou faut-il alors
plutôt envisager un stockage dans une table par collation ? Dans ce
cas, quel est l'intérêt dans la réalité d'un champ nchar / nvarchar ?





Si l'on a à gérer plusieurs langues au sein d'une même table, il est à
parier que suivant le contexte on aura besoin une fois d'un tri ou d'une
égalité donc d'une certaine collation, une autre fois d'une autre...

Comment est-ce que l'on peut gérer ça requête à requête ? On peut en
effet imaginer sans peine avoir besoin d'un ordre de tri et comparaison
donné pour une langue A, et des paramètres tout autres pour une langue B.
Si tout est stocké dans la même table... Est-ce que l'on peut définir un
"profil" que l'on pourr aindiquer à chaque requête ? Ou la collation
s'applique forcément à une colonne ? Une table ? Dans ce cas il faudra
soit créer plusieurs colonnes soit plusieurs tables...

Bref, profiter d'Unicode pour pouvoir stocker tous les scripts du monde
c'est bien, mais dans la pratique on peut imaginer rencontrer ce genre de
prb bloquants entre plusieurs langues que l'on doit gérer...




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************


Avatar
Pierre Goiffon
Med Bouchenafa wrote:
Voici ce que Microsoft dit sur le sujet
http://msdn.microsoft.com/en-us/library/ee240835%28SQL.105%29.aspx

Il est cependant certain que l'espace peut-etre est un probleme dans
certains cas.
Sinon comment expliquer que SQL Server 2008 R2 apporte comme nouveauté
la compression Unicode
http://msdn.microsoft.com/en-us/library/ms189617.aspx



Bonjour Med, merci de ces 2 liens (juste une remarque, ils sont
inversés) très instructifs.

Le 2eme lien (Storage and Performance Effects of Unicode) amène
directement vers un document instructif :
http://msdn.microsoft.com/en-us/library/ms186356.aspx
Qui commence par :
"Collations control the physical storage of character strings in SQL
Server. A collation specifies the bit patterns that represent each
character and the rules by which characters are sorted and compared."

Le codage utilisé pour le stockage fait donc bien partit de la collation
dans SQL Server 2008. Et comme c'était le cas pour SQL Server 2000, je
suppose que c'est le cas pour toutes les versions de SQL Server ?

Tel que je le comprend donc, toutes les collations stockent dans des
codages non Unicode. Si on veut passer par Unicode, il faut utiliser les
nchar/nvarchar, et dans ce cas les "Unicode sorting rules" s'appliquent.

Le document suivant me laisse à penser qu'il y aurait en plus des
collations ne s'appliquant qu'à ces types de champs (et qui
permettraient d'indiquer un ordre de tri / comparaison défini ?) :
http://msdn.microsoft.com/en-us/library/cc879307.aspx

La liste des collations Windows contient de ces "unicode only collations" :
http://msdn.microsoft.com/en-us/library/ms188046.aspx
Je lis "Unicode-only Windows collations can only be applied to
column-level or expression-level data". ok pour column, mais que veux
dire 'expression-level data' ?
Avatar
Sylvain Lafontaine
En 2009, c'est maintenant rendu plus une question de sécurité et de prudence
envers le présent et le futur qu'une question de performance. Plusieurs
personnes ici disent qu'à moins d'avoir une bonne raison, vous devez
utiliser l'ascii au lieu de l'unicode. Je crois qu'en 2009, il faudrait
plutôt dire qu'à moins d'avoir une bonne raison, il vaut mieux utilisr
l'unicode par défaut et que de continuer à utiliser l'ascii (ou les
caractères 8 bit pour être plus exact), c'est une source potentiel de
problèmes et de bugs supplémentaires.

Maintenant, on retrouve souvent l'argument qu'avec l'utilisation du code
Windows-1252 (qui corrige le problème du symbole de l'Euro présent dans le
code 1251) et la disparition presque complète des applications utilisant les
anciens code page DOS et OEM, il est maintenant rendu totalement superflu
d'utiliser l'unicode pour stocker les accents français et qu'il est
impossible d'avoir des problèmes présents ou futurs si vous prenez la
décision de vous en tenir exclusivement aux accents français. C'est une
décision qui se respecte et qui a ses avantages mais qui offre toutefois les
problèmes suivants:

1- Même s'ils ont presque disparu, il reste quand même encore beaucoup
d'applications utilisant les codes pages DOS et OEM et les problèmes de
changement de code page sont toujours bien existants. Par example, dans le
newsgroup anglais m.p.sqlserver.programming, il y a ce message posté le
2009/10/06 au sujet d'un problème avec le symbole de la livre britannique £
et le code page SQL_Latin1_General_CP1_CI_AS. Noter que l'on ne parle même
pas ici de l'euro ou d'accents français. Comme autre example, voici un
extrait d'un courriel reçu d'un client voilà moins de deux semaines:

« ... Il va rester ? vérifier le menu de Notre -Dame-De-Sion (un m?me prix
pour les repas) comme on avais discuté. ... »

Étrangement, le e avec l'accent aigu apparaît correctement mais les
caractères accentués à et ê (ainsi que les è) ont été remplacé par un point
d'interrogation ? et cela était de même pour le reste du message également.

À cela, vous devez ajouter le problème potentiel d'un utilisateur
utilisant une machine configurée de base pour une autre langue que
l'alphabet latin de base; c'est-à-dire le latin étendu ou pire encore,
non-latin. Sur l'internet, les frontières aujourd'hui ont tendance à
s'abattre, pas à s'élever (sauf exception).

2- En 2009, vous avez simplement l'air complètement ridicule si vous n'êtes
pas encore capable de stocker le nom d'un usager utilisant des caractères
latins accentués non-français. Pas besoin d'aller chercher le japonais
comme example pour ça.

3- Si votre application est vraiment un succès, vous ne savez jamais quand
est-ce que vous aller avoir besoin d'élargir votre horizon.

Évidemment, si vous êtes vraiment restraint par un problème de performance
et que vous avez tout soupesé dans la balance, l'utilisation de Windows-1252
est pleinement envisageable mais dans ce cas là, j'imagine que vous ne devez
pas venir ici pour savoir c'est quoi la différence entre l'ascii et
l'unicode. Je n'ai jamais dit qu'il ne fait plus utiliser l'ascii mais que
si vous ne connaissez pas la différence entre les deux ou que vous ne savez
pas quoi faire ou que si les besoins sont indéfinies ou que vous ne savez
pas dans quoi vous vous embarquez exactement (genre le client vous jure la
main sur le coeur qu'il n'y aura jamais besoin d'utiliser autre chose que le
code Windows-1252 mais qu'en cas de problème, c'est vous qui allez êtes le
responsable pour corriger le problème à vos frais), l'unicode doit être le
choix par défaut et non pas le contraire. Je préfère voir le client payer
pour ses erreurs et non pas de me voir moi à payer pour ses erreurs à lui.

Pour le reste et sauf peut-être pour les fermes de serveurs, c'est le plus
souvent un mythe que de dire que vous pouvez corriger un problème de
performance en utilisant l'ascii au lieu de l'unicode; spécialement mais pas
nécessairement si vous êtes sur un serveur unique. Si le serveur est trop
lent pour supporter une application en unicode, il est fort problablement
trop lent pour supporter la même application en ascii. Les fermes de
serveurs représente un cas particulier mais même dans ces cas là, si vous
faites une erreur de decision, le coût du passage à l'unicode risque de
coûter pas mal plus cher que les économies matérielles faites au début.
Parlez-en à ceux qui ont eu à vivre ce problème; spécialement à ceux qui ont
la joie d'avoir à supporter deux configurations différentes parce que
certains clients ne veulent pas changer un système déjà éprouvé.

--
Sylvain Lafontaine, ing.
MVP pour « Windows Live Platform »
Courriel: sylvain2009 sylvainlafontaine com (remplissez les blancs, svp.)
Consultant indépendant et programmation à distance pour Access et
SQL-Server.


"Med Bouchenafa" wrote in message
news:
Voici ce que Microsoft dit sur le sujet
http://msdn.microsoft.com/en-us/library/ee240835%28SQL.105%29.aspx

Il est cependant certain que l'espace peut-etre est un probleme dans
certains cas.
Sinon comment expliquer que SQL Server 2008 R2 apporte comme nouveauté la
compression Unicode
http://msdn.microsoft.com/en-us/library/ms189617.aspx

Il est vrai que ces dernieres années, la tension s'est largement relachée
sur les performances avec la puissance materielle des serveurs
J'ai vu beaucoup prendre la decision de passer tout en Unicode.
Pourquoi pas?
Mais moi, je continue, comme avant, á utiliser le deux
Unicode ou pas Unicode, c'est fondamentalement le business qui decide en
premier
Je me vois mal codifier une colonne Sex avec NCHAR(1) ( Exemple reel chez
un client)

Mais bon,

Bien cordialement
Med Bouchenafa

"Fred BROUARD" wrote in message
news:#
En 20 ans de bases de données et en près de 15 avec SQL Server, je n'ais
eut qu'une seule fois l'obligation de passer toute la base en UNICODE
parce que le cahier des charges précisait : "une personne peut commander
un service en japonais sur le site et avoir ce service à sa descente
d'avion à New York ce qui suppose que dans les mêmes tables de la base
différentes langues du monde entier seront utilisées."

Dans tous les autres cas :
- ASCII pour les langues latines
- UNICODE pour les langues idéographique
donc au coup par coup à l'installation ce que l'utilisation de DOMAINES
SQL permet facilement par redéfinition des domaines à la création de la
base.

A +

Pierre Goiffon a écrit :
Sylvain Lafontaine wrote:
D'abord une réflexion qui me vient rapidement en lisant vos arguments
: il est quand même très répandu par ici qu'une base ne stocke que des
données en scripts latins. Utiliser Unicode dans ce cas est plutôt
"overkill"



Même si vous ne stocker que des scripts latins et excluant par le fait
tout caractère étranger (grec, russe, etc.), vous pouvez quand même
être frappé par un problème d'encodage dû à un problème de
communication avec une application client et c'est quelque chose que
j'ai vu souvent par le passé.


(...)
Le problème c'est que c'est bien souvent loin d'être le cas. Par
example, il y a deux codepages par machine windows: l'OEM, qui
correspond au codepage DOS classique et le codepage Windows.



Je ne comprend pas cet argument : dans tous les cas, vous devez
contrôler ces 2 points :
- stockage dans la base de données
- charset utilisé par l'application client dans sa connexion à la BDD
+ tout le reste de la chaine jusqu'à la couche présentation...

Tout passer en Unicode ne permet pas de s'affranchir de cela, ou quelque
chose m'échappe ?!!??

Les notions de codage sont la plupart du temps survolées par les
développeurs, qui se disent "j'ai lu qu'il fallait passer en Unicode
pour résoudre le prb" et ne cherchent pas à aller plus loin. Résoudre un
prb sans comprendre sa cause et avec une manip dont on ne saisit pas les
tenants et aboutissants me parait plus que dangereux !

Mais je vous ai peut être mal compris ?

Évidemment, ils y a ceux qui gèrent de très gros systèmes et pour qui
le passage à l'unicode peut représenter une augmentation significative
de coûts parce que leur système travaille déjà à saturation et qu'ils
ne prévoient pas avoir à supporter autre chose que le français dans un
avenir prévisible - ou qu'ils s'en foutent de ne pas supporter autre
chose même si cela pourrait leur être avantageux - et qu'ils ne
prévoient pas interfacer avec autre chose que des applications-clients
ayant strictement le même codepage qu'eux. Pour eux, cela peut être
une décision raisonnable ou un risque calculé que de s'en tenir au code
Ascii. Cependant, s'ils se trompent, les économies réalisées au début
vont fondre plus vite que neige au soleil et ils risquent de regretter
amèrement leur décision par la suite. C'est pourquoi, avant de prendre
cette décision, il faut vraiment savoir où l'on s'en va et ne pas
regarder la question uniquement sous l'aspect économie de CPU/barrette
de mémoire/espace disque. La puissance des machines double à tous les
18 mois; le coût du programmeur, lui, ne diminue pas. En fait, dans le
cas du programmeur, c'est le contraire qui se passe: s'il y a une
erreur dans le choix de l'Ascii/Unicode, plus vous aller attendre
longtemps avant de corriger l'erreur, plus elle va vous coûter cher à
corriger.



Trois choses après vous avoir lu :

- Des serveurs SQL Server qui sont dimensionné au plus juste, de mon
expérience c'est le cas très largement général... Les machines sont de
plus en plus puissantes, mais les consommations suivent très fidèlement
cette courbe de croissance : en 12 ans d'expérience professionnelle, je
vois toujours autant de prb de performance.

- Si je parlais de scripts latins, c'était pour faire référence à ISO
Latin-9 (iso 8859-15) ou Windows-1252, deux charset 8 bits qui
permettent de stocker toutes les langues d'Europe de l'Ouest. Donc bien
plus que le seul français ! Et on ne peut quand même dire sans se
tromper que la plupart des applications par chez nous (dans les
entreprises françaises) n'ont pas à stocker bien plus... Mais je vous
rejoins évidemment sur le choix à la conception, qui doit être bien
raisonné !
Par ailleurs, parler comme vous le faite "d'ASCII", qui fait en général
référence à us-ascii et donc un charset 7 bits, porte donc assez à
confusion.

- Corriger l'erreur : cela fait partie de mes interrogations... Si l'on
a à modifier le stockage d'une bdd SQL Server vers de l'Unicode,
qu'est-ce que cela va impliquer comme opération ? N'est-ce pas une
"simple" conversion, qui va juste entraîner un arrêt de service le temps
qu'elle prendra ? Les contenus précédents pouvant être recodés en
Unicode, et les anciennes applications clientes se connectant toujours
avec le charset précédent. (pas compris pourquoi vous parliez de "2
versions" ?)
C'est aussi entre autre pourquoi je ne comprend pas la différence entre
ces champs nchar et la collation... on y arrive juste en-dessous.

Pour les questions : je ne comprend pas le lien entre collation et
champs nchar / nvarchar ?



La collation n'est pas associée au stockage des caractères mais à leur
interprétation: tri ou/et égalité de caractères



De ce que j'en avais retenu la collation en bdd regroupait les 3 notions
:
- codage au stockage
- comparaison
- tri

Par quel paramètre indique-t-on alors dans quel codage stocker les
champs textes char, varchar ? Est-ce figé à un codage non modifiable, ce
qui expliquerait l'existence de ces nchar et nvarchar ? Donc le choix
entre un codage par défaut ou Unicode ? (que je suppose être UTF-16 ?)

Je viens de revérifier, il y avait bien des noms laissant à penser à des
codage dans les collation sur SQL Server 2000 : sur
http://msdn.microsoft.com/en-us/library/aa226047%28SQL.80%29.aspx par
exemple Latin1_General est marqué comme stocké en "1252" (ce qui laisse
à penser qu'il s'agit de Windows-1252)

(...)
avec comme résultat:

cote
coté
côte
côté

ce qui est incorrect en français standard. D'autres languages
utilisant l'alphabet latins ont des règles de tri et d'équivalence
beaucoup plus complexes que le français, l'allemand ou l'espagnol.



C'était exactement le sens de ma question :

Ensuite, comment gérer les autres critères de la collation (tri,
comparaison) lorsque l'on a dans une même colonne des données dans de
nombreux scripts ? Par exemple, peut-on obtenir un ordre de tri pour
telle famille de scripts, tel autre pour un autre, ... Ou faut-il
alors plutôt envisager un stockage dans une table par collation ? Dans
ce cas, quel est l'intérêt dans la réalité d'un champ nchar / nvarchar
?





Si l'on a à gérer plusieurs langues au sein d'une même table, il est à
parier que suivant le contexte on aura besoin une fois d'un tri ou d'une
égalité donc d'une certaine collation, une autre fois d'une autre...

Comment est-ce que l'on peut gérer ça requête à requête ? On peut en
effet imaginer sans peine avoir besoin d'un ordre de tri et comparaison
donné pour une langue A, et des paramètres tout autres pour une langue
B. Si tout est stocké dans la même table... Est-ce que l'on peut définir
un "profil" que l'on pourr aindiquer à chaque requête ? Ou la collation
s'applique forcément à une colonne ? Une table ? Dans ce cas il faudra
soit créer plusieurs colonnes soit plusieurs tables...

Bref, profiter d'Unicode pour pouvoir stocker tous les scripts du monde
c'est bien, mais dans la pratique on peut imaginer rencontrer ce genre
de prb bloquants entre plusieurs langues que l'on doit gérer...




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************





1 2 3