2010-08-05 4 views
1

Cela pourrait être douloureusement évident pour certains (la plupart?) D'entre vous, mais il me dérange depuis un moment maintenant.Stockage des caractères régionaux (slovènes) dans la base de données

J'ai deux bases de données s'exécutant sur le même serveur SQL (2005). Autant que je puisse voir, ils ont tous deux la même langue/propriétés régionales. Les deux ont collation mis à "Sloveninan_CL_AS" et pourtant on stocke tous les caractères spéciaux slovènes (è, ž, š) sans problème, et l'autre les couvre de leurs "matches" sensibles non-régionaux (c, z, s).

Toutes les chaînes soumises à des caractères régionaux dans les deux bases de données sont stockées dans des champs de même type (varchar).

Je me demande quels sont les autres paramètres qui pourraient affecter ce comportement? Quelles étapes supplémentaires puis-je faire pour m'assurer que les caractères spéciaux seront sauvegardés correctement dans la deuxième base de données?

EDIT: La seule information supplémentaire qui pourrait se révéler utile, je peux penser est que la deuxième base de données (« dysfonctionnement ») a été initialement créé avec un paramètre de classement différent et a été changé à un moment plus tard, alors que la première était (probablement) créé avec le paramètre défini sur la valeur actuelle. Cependant je pense, puisque le paramètre peut être changé, cela ne devrait pas être un problème. En outre, le serveur a été redémarré depuis que le paramètre de classement a été modifié.

+0

comment (application client, statemen sql t via le studio de gestion), où (directement sur le serveur, PC client différent) et sous quel environnement de système d'exploitation (version du système d'exploitation, les paramètres régionaux, etc ...) cela se produit-il? – pastacool

+0

@pastacool cela se produit dans toutes les situations, mais il a d'abord été remarqué grâce à une application cliente. En raison de son étrangeté, je l'ai essayé avec une déclaration SQL via le studio de gestion et directement éditer les données dans le tableau (clic droit sur le tableau -> Modifier). Toutes les options produisent le même résultat: les caractères dans une base de données sont stockés correctement et dans un autre sont "convertis" - –

+0

lorsque vous avez fait vos modifications, avez-vous travaillé directement sur le serveur en question ou toujours avec le même studio de gestion? – pastacool

Répondre

2

Je préfère utiliser le type de données NVARCHAR() à la place. NVARCHAR utilise Unicode, ce qui est beaucoup plus convivial quand il s'agit de localisation.

Quoi qu'il en soit, il est définitivement un problème matériel que la base de données a été initialement créée avec un classement différent. Lorsque vous définissez le classement sur une base de données, vous définissez en fait le classement par défaut pour les objets nouvellement créés. Regardez les tables elles-mêmes. Je suis prêt à parier qu'ils sont toujours fixés à l'ancienne collation. Vous devrez peut-être recréer ou modifier les tables et les index pour que le nouveau classement prenne effet.

http://msdn.microsoft.com/en-us/library/ms175835.aspx

+1

Eh bien que je sais, mais ce n'est pas vraiment pertinent ... Autant que je puisse voir, varchar est parfaitement capable de stocker les caractères qui m'intéressent - il le fait avec succès sur le même serveur! –

+0

Assez vrai, mais toujours en utilisant Unicode élimine le besoin d'utiliser la page de codes par défaut et autres. Parfois, le slovène n'est pas la seule langue qui remplira ces colonnes. IMO en n'utilisant pas Unicode, vous vous ouvrez à la douleur. Juste mon avis. –

+0

+1 pour le lien MSDN, ce qui explique que le changement de classement de la base de données n'affecte pas les tables définies par l'utilisateur qui existent déjà – pastacool

1

Avez-vous définitivement changé le classement sur la base de données elle-même? Pas seulement la colonne? Lorsque je tente le script suivant sur une base de données de test et mettez l'avant et en arrière classement de la base entre Slovenian et latin, je reçois des résultats différents pour le caractère č (la N la version préfixée fonctionne toujours)

SET NOCOUNT ON 

DECLARE @testtable TABLE 
(
A VARCHAR(5) COLLATE Slovenian_CI_AS, 
B VARCHAR(5) COLLATE Slovenian_CI_AI 
) 

INSERT INTO @testtable 
VALUES ('čžš','čžš') 

INSERT INTO @testtable 
VALUES (N'čžš',N'čžš') 

SELECT *,CAST(A AS VARBINARY(6)) ,CAST(B AS VARBINARY(6)) 
FROM @testtable 

Slovenian_CI_AS

A  B      
----- ----- -------------- -------------- 
čžš čžš 0xE89E9A  0xE89E9A 
čžš čžš 0xE89E9A  0xE89E9A 

Latin1_General_CI_AS

A  B      
----- ----- -------------- -------------- 
cžš cžš 0x639E9A  0x639E9A 
čžš čžš 0xE89E9A  0xE89E9A 
+0

Vous avez raison. La base de données et la console de classement de la table ont été correctement définies sur Slovenian_CI_AS, mais le classement ** column ** est resté au niveau du paramètre précédent (avant que le classement ne soit modifié dans la base de données). Je vous remercie! –

+0

@Rekreativc - C'était en fait la suggestion de Dave Markle Je pensais que vous pourriez avoir le problème inverse! –

Questions connexes