2012-12-04 6 views
8

J'ai un problème avec un caractère spécial inséré dans une table de SQL Server 2008 R2. Le point est que lorsque j'essaie d'insérer une chaîne avec le caractère º (par exemple 3 COUDE 90º LONG RADIUS) dans le tableau, cela ressemble à ceci: 3 COUDE 90 LONG RADIUS, et quand j'essaie de sélectionner tous les lignes qui contiennent le caractère le résultat est nul.Caractère spécial dans SQL

J'ai essayé de faire la sélection avec ASCII en faisant ceci: select * from itemcode où la description comme '%' + char (63) + '%'

et en faire savoir que le ASCII de cette symbole est 63:

ASCII select ('')

Mais cela ne fonctionne pas. Que dois-je faire pour sélectionner toutes les lignes qui ont ce caractère et que dois-je faire pour que ce SQL reconnaisse le caractère º?

Merci

+0

Avez-vous essayé le caractère 167? – RonaldBarzell

+0

Cela peut également poser un problème avec votre client SQL, en transmettant les valeurs incorrectes ou en les affichant incorrectement. –

+0

Le type de données pour le champ varchar ou nvarchar est-il? Vous pouvez essayer nvarchar si vous ne l'utilisez pas. – wcm

Répondre

8

Le degree symbol

U+00B0 ° degree sign (HTML: ° °) 

n'est pas un caractère ASCII Acter et nécessite généralement une colonne NVARCHAR et un littéral de chaîne N''. (Sauf pour les codepages etc qui prennent en charge le symbole)

63 est le code du question mark, qui est la solution de repli pour votre marque inverse question en ASCII:

select UNICODE('�') => 63 
select UNICODE(N'�') => 65533 

où 65533 est le Unicode Replacement Character utilisé pour afficher des caractères qui n'a pas pu être converti ou affiché.

+0

Mais comment puis-je sélectionner toutes les lignes qui contiennent ce caractère de remplacement Unicode? J'ai essayé sélectionnez * from itemcode où description comme '%' + char (65533) + '%' Mais ne fonctionne pas –

+0

vous devez insérer vos données de sorte que le caractère de remplacement n'est même pas stocké. essayez N '°' plutôt que '°'. – devio

+0

Merci pour la réponse, mais si l'information est déjà stockée et que je veux voir toutes les lignes qui ont ce problème, que puis-je faire? –

2

quand je lance ceci:

print ascii('º') 

je reçois 186 comme la valeur du code ascii, alors essayez:

select * from YourTable Where Description like '%'+char(186)+'%' 

pour voir tous les codes ascii exécuter ceci:

;WITH AllNumbers AS 
(
    SELECT 1 AS Number 
    UNION ALL 
    SELECT Number+1 
     FROM AllNumbers 
     WHERE Number<255 
) 
SELECT Number,CHAR(Number) FROM AllNumbers 
OPTION (MAXRECURSION 255) 

EDIT op indiqué dans un commentaire qu'ils utilisent des colonnes nvarchar.

contrefacteur à propos ascii, utilisez NCHAR (Transact-SQL) pour produire un symbole de degré:

print '32'+NCHAR(176)+'F' --to display it 

select * from YourTable 
    Where Description like '%'+NCHAR(176)+'%' --to select based on it 

et utiliser UNICODE (Transact-SQL) pour obtenir la valeur:

print UNICODE('°') 

retours:

176 
+0

Je l'ai déjà essayé mais ne fonctionne pas = ( –

+0

exécuter 'SELECT DATABASEPROPERTYEX ('YOUR_DATABASE_NAME', 'Collation ') SQLCollation; ', je reçois' SQL_Latin1_General_CP1_CI_AS', donc vous obtenez probablement quelque chose de différent –

+0

si vous utilisez nvarchar comme indiqué dans un autre commentaire, vous devez ** oublier la commande ASCII() '** de SQL Server signifie «Code normalisé américain pour l'échange d'information» et a été mis en place bien avant l'internationalisation et n'inclut pas assez de caractères spéciaux ** vous devez ** utiliser UNICODE ('expression_ncharacter') ** –

1
select top 10 * from table_name 
where tbl_colmn like N'%'+ NCHAR(65533) + N'%' 

la La fonction NCHAR (65533) renverra le caractère que vous cherchez.

+0

Ne fonctionne pas pour moi. est - '34 '. 'SELECT unicode (SUBSTRING (texte, 3, 1))' => résultat: ** 65533 **. 'SELECT * FROM [dbo]. [Bla] OERE [texte] comme N '% [' + nchar (65533) + N ']%'' => rusult: 0 lignes. Mais, je sais à propos de plus de 19k lignes avec caractère. – TheZodchiy