2009-03-17 7 views
3

Supposons qu'il ya une table nommée "myTable" avec trois colonnes:Weird SQL Behavior, pourquoi cette requête ne renvoie rien?

{**ID**(PK, int, not null), 
**X**(PK, int, not null), 
**Name**(nvarchar(256), not null)}. 

Soit {4, 1, аккаунт} un dossier sur la table.

select * from myTable as t 
    where t.ID=4 
    AND t.X = 1 
    AND ( t.Name = N'аккаунт' ) 

select * from myTable as t 
    where t.ID=4 
    AND t.X = 1 
    AND ( t.Name LIKE N'%аккаунт%' ) 

La première requête renvoie l'enregistrement, mais pas la seconde? Pourquoi?

systèmes où ces problèmes sont expérimentés:

* Windows XP - Professional - Version 2002 - SP3
serveur Collation: Latin1_General_CI_AS
Version: 9.00.3073.00
Niveau: SP2
Édition: Developer Edition

Sever Collation: SQL_Latin1_General_CP1_CI_AS
Version: 9.00.3054.00
Niveau: SP2
Édition: Enterprise Edition

Résultats:

SELECT SERVERPROPERTY('SQLCharSetName') 
iso_1 

Using OSQL.exe 
0x30043A043A04300443043D04420400000000000000000000000000000000 
0x3F3F3F3F3F3F3F0000000000000000000000000000000000000000000000 
0x253F3F3F3F3F3F3F25000000000000000000000000000000000000000000 

SELECT CAST(name AS BINARY), 
     CAST(N'аккаунт' AS BINARY), 
     CAST(N'%аккаунт%' AS BINARY) 
FROM myTable t 
WHERE t.ID = 4 
     AND t.X = 1 

CAST(name AS BINARY) 
0x30043A043A04300443043D04420400000000000000000000000000000000 
CAST(N'аккаунт' AS BINARY) 
0x3F3F3F3F3F3F3F0000000000000000000000000000000000000000000000 
CAST(N'%аккаунт%' AS BINARY) 
0x253F3F3F3F3F3F3F25000000000000000000000000000000000000000000 

Répondre

0

Bon, après beaucoup de recherches, je l'ai trouvé est en effet un problème trouvé sur les versions suivantes de SQL Server 2005:

Windows XP - Professional - version 2002 - SP3
Version: 9.00.3073.00
Niveau: SP2
Edition: Developer Edition

version: 9.00.3054.00
Niveau: SP2
Édition: Édition Entreprise

..peut aussi être d'autres versions. CORRECTIF: mise à niveau vers SP3.

1

Les deux requêtes renvoient le même résultat f ou moi.

select * from myTable as t 
where t.ID=4 
AND t.X = 1 
AND (t.Name = N'аккаунт') 

Retours:

ID   X   Name 
----------- ----------- ------------ 
4   1   аккаунт 

Et

select * from myTable as t 
where t.ID=4 
AND t.X = 1 
AND (t.Name LIKE N'%аккаунт%') 

Retours:

ID   X   Name 
----------- ----------- ------------ 
4   1   аккаунт 

(1 ligne (s) affectés)

Ma version de SQL Server est:

Microsoft SQL Server 2005 - 9.00.3077.00 (Intel X86) 
    Dec 17 2008 15:19:45 
    Copyright (c) 1988-2005 Microsoft Corporation 
    Express Edition on Windows NT 5.1 (Build 2600: Service Pack 3) 

Mon classement est réglé sur: SQL_Latin1_General_CP1_CI_AS

Mes résultats pour Quassnoi: 0x30043A043A04300443043D04420400000000000000000000000000000000 0x30043A043A04300443043D04420400000000000000000000000000000000 0x250030043A043A04300443043D0442042500000000000000000000000000

(1 row (s) affected)

+0

Ce résultat est attendu. @ Le littéral cyrillique de Newbie est converti en points d'interrogation, il a probablement quelques problèmes avec l'encodage du côté client. – Quassnoi

+0

Pourriez-vous indiquer la version du serveur SQL que vous utilisez? Merci! – Newbie

3

Pourriez vous s'il vous plaît signaler le résultat de la requête suivante:

SELECT CAST(name AS BINARY), 
     CAST(N'аккаунт' AS BINARY), 
     CAST(N'%аккаунт%' AS BINARY) 
FROM myTable t 
WHERE t.ID = 4 
     AND t.X = 1 

Cela aidera à réduire le problème.

MISE À JOUR:

Comme je peux voir des résultats de votre requête, vous avez un problème avec le codage.

Les littéraux cyrilliques de vos constantes de chaîne sont en cours de conversion en points d'interrogation (0x3F).

Malheureusement, je ne peux pas reproduire ce comportement avec Management Studio sur mon serveur de test.

Je suppose qu'il y a un problème avec OS paramètres, car les caractères cyrilliques n'atteignent probablement même pas SQL Server.

Pourriez-vous s'il vous plaît répondre à trois questions:

  1. Qu'est-ce que OS utilisez-vous (version, langue, MUI le cas échéant)

    • Qu'est-ce que ce retour de la requête:

      SELECT SERVERPROPERTY ('SQLCharSetName')

    • Connectez-vous à votre serveur en utilisant osql.exe et d'émettre cette requête:

      SELECT CAST (nom AS BINARY), CAST (N'аккаунт » AS BINARY), CAST (N '% аккаунт%' AS BINARY) DE myTable t OÙ t.ID = 4
      ET tX = 1 GO

    Que faut-il en retour étant exécuté osql.exe?

+0

Vous pouvez voir les résultats maintenant. Merci pour l'aide! – Newbie

+0

Ces requêtes ne fonctionnent pas directement dans Microsoft Sql Server Management Studio. – Newbie

+0

Microsoft SQL Server Management Studio \t 9.00.3042.00 – Newbie