Weird SQL Behavior, pourquoi cette requête ne renvoie-t-elle rien?
-
19-08-2019 - |
Question
Supposons qu’il existe une table nommée " myTable " avec trois colonnes:
{**ID**(PK, int, not null),
**X**(PK, int, not null),
**Name**(nvarchar(256), not null)}.
Soit {4, 1, & # 1072; & # 1082; & # 1082; & # 1072; & # 1091; & # 1085; & # 1090;} un record 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 dans lesquels ce problème est rencontré:
* Windows XP - Professionnel - Version 2002 - SP3
Classement du serveur: Latin1_General_CI_AS
Version: 9.00.3073.00
Niveau: SP2
Edition: Developer Edition
Classement par serveur: SQL_Latin1_General_CP1_CI_AS
Version: 9.00.3054.00
Niveau: SP2
Edition: 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
La solution 3
D'accord, après de nombreuses recherches, j'ai découvert qu'il s'agissait d'un problème rencontré sur les versions suivantes de SQL Server 2005:
Windows XP - Professionnel - Version 2002 - SP3
Version: 9.00.3073.00
Niveau: SP2
Edition: Developer Edition
Version: 9.00.3054.00
Niveau: SP2
Edition: Édition Entreprise
.. peut également être une autre version.
CORRECTIF: effectuez une mise à niveau vers SP3.
Autres conseils
Pourriez-vous s'il vous plaît publier 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.
UPDATE:
Comme je peux le constater par les résultats de votre requête, vous rencontrez un problème d'encodage.
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 problème avec Management Studio
sur mon serveur de test.
Je pense qu'il y a un problème avec les paramètres OS
, car les caractères cyrilliques n'atteignent probablement même pas SQL Server
.
Pourriez-vous s'il vous plaît répondre à trois autres questions:
-
Quel
système d'exploitation
utilisez-vous (version, langue,MUI
le cas échéant)-
Qu'est-ce que cette requête renvoie:
SELECT SERVERPROPERTY ('SQLCharSetName')
-
Connectez-vous à votre serveur à l'aide de
osql.exe
et émettez cette requête:SELECT CAST (nom AS BINARY), CAST (N ° & # 1072; & # 1082; & # 1082; & # 1072; & # 1091; & # 1085; & # 1090; 'AS BINARY], CAST (N '% & # 1072; & # 1082; & # 1082; & # 1072; & # 1091; & # 1085; & # 1090;%' BINAIRE) De ma table t O t.ID = 4
ET t.X = 1 GO
Que renvoie-t-il en cours d'exécution dans
osql.exe
? -
Les deux requêtes donnent le même résultat pour moi.
select * from myTable as t
where t.ID=4
AND t.X = 1
AND (t.Name = N'аккаунт')
Retourne:
ID X Name
----------- ----------- ------------
4 1 аккаунт
Et
select * from myTable as t
where t.ID=4
AND t.X = 1
AND (t.Name LIKE N'%аккаунт%')
Retourne:
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)
(1 ligne (s) affectée (s))
Ma version de SQL Server est la suivante:
<*> Mon classement est défini sur: SQL_Latin1_General_CP1_CI_AS
Mes résultats pour Quassnoi:
0x30043A043A04300443043D04420400000000000000000000000000000000
0x30043A043A04300443043D04420400000000000000000000000000000000
0x250030043A043A04300443043D044204250000000000000000000000
(1 ligne (s) affectée (s))