Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server renvoie ??? lorsque la colonne est mise à jour avec des caractères thaïlandais

Il n'y a pas beaucoup d'informations fournies dans la question. Tout ce que nous savons, c'est :

  • La colonne utilise le classement de Thai_CI_AS (du moins, c'était comme si la question l'indiquait)
  • Les caractères thaïlandais sont transmis
  • Ce qui est stocké dans la colonne est :???

Cependant, de cela seul, nous pouvons déduire deux choses :

  1. La chaîne entrante n'est ni un NVARCHAR paramètre / variable, ni un littéral de chaîne préfixé par un "N" majuscule,

    et

  2. Le classement par défaut pour la base de données dans laquelle la requête est exécutée (pas nécessairement la base de données dans laquelle la table existe) est not une collation thaïlandaise.

Nous ne savons pas si la colonne de destination est VARCHAR ou NVARCHAR , mais cela n'a pas d'importance si la Collation de la colonne est une Collation thaïlandaise (puisque cela permettra VARCHAR données pour contenir les caractères thaïlandais, et NVARCHAR fonctionnerait malgré tout).

Si soit :

  • la chaîne entrante utilise un NVARCHAR paramètre (ou s'il s'agit d'un littéral de chaîne, préfixez-le avec un "N" majuscule),

    ou

  • la requête a été exécutée dans une base de données qui a un classement par défaut thaïlandais

alors les caractères thaïlandais seraient stockés comme prévu.

L'exemple suivant illustre ce comportement. J'utilise un Thai Character Khomut U+0E5B sur une instance ayant un Korean_100_CS_AS_KS_WS_SC Classement par défaut au niveau de l'instance. La colonne de destination a un classement de Thai_CI_AS . Tout d'abord, alors que la base de données "actuelle" est celle qui ne le fait pas J'ai un classement par défaut en thaï, j'ajoute le caractère deux fois :une fois avec le préfixe "N" et une fois sans préfixe sur la chaîne littérale :

USE [tempdb];
-- DROP TABLE #Thai;
CREATE TABLE #Thai (ID INT IDENTITY(1, 1), Col1 VARCHAR(50) COLLATE Thai_CI_AS);

-- In a DB with a non-Thai default Collation:
INSERT INTO #Thai (Col1) VALUES ('๛');
INSERT INTO #Thai (Col1) VALUES (N'๛');

Ensuite, je passe à une base de données qui fait avoir un classement par défaut thaïlandais et insérer uniquement la chaîne non préfixée (pas vraiment besoin de re-tester la chaîne préfixée "N") :

USE [other_db];

-- In a DB with a Thai default Collation:
INSERT INTO #Thai (Col1) VALUES ('๛');


SELECT * FROM #Thai;

Le résultat est :

ID  Col1
1   ?
2   ๛
3   ๛

Comme vous pouvez le voir (le point # ci-dessous correspond à l'ID # dans les résultats ci-dessus) :

  1. La chaîne non préfixée par "N", utilisée dans une base de données utilisant un classement par défaut non thaïlandais, a été traduite en ?
  2. La chaîne préfixée "N", également utilisée dans une base de données utilisant un classement par défaut non thaïlandais, stockait la valeur correctement
  3. La chaîne non préfixée par "N", utilisée dans une base de données qui a un classement par défaut thaïlandais, a stocké la valeur correctement