J'utilise SQL Server 2008 R2 et je souhaite stocker caractères japonais dans l'une des colonnes de ma table.
Dis que je veux stocker des noms japonais, comment puis-je y parvenir? Existe-t-il un moyen simple?
Vous devez utiliser NCHAR(1 - 4000)
ou NVARCHAR
, soit comme NVARCHAR(1 - 4000)
ou NVARCHAR(MAX)
pour stocker de 4001 à un peu plus de 1 073 741 822 caractères (ou peut-être moins si vous en stockez). caractères supplémentaires comme décrit ci-dessous).
Techniquement, vous pouvez stocker des caractères japonais dans les champs VARCHAR
si vous utilisez un Japanese_*
Assemblage associé à la page de code 932. Cependant, cela est considéré comme une approche "héritée" et vous poserait encore des problèmes. La façon appropriée de gérer cela est d'utiliser un type de données Unicode comme mentionné ci-dessus. Veuillez consulter la section [~ # ~] mise à jour [~ # ~] à la fin pour plus de détails sur VARCHAR
.
Vous souhaiterez également spécifier un classement japonais afin que les données soient comparées et triées comme prévu. Vous pouvez trouver les classements japonais disponibles en utilisant:
SELECT * FROM fn_helpcollations() WHERE name LIKE N'Japanese%';
Et vous utilisez cette valeur dans la spécification de champ comme:
CREATE TABLE dbo.test
(
JapaneseText NVARCHAR(3000) COLLATE Japanese_CI_AS_KS_WS
);
Veuillez consulter la section suivante des pages MSDN pour plus d'informations sur l'utilisation du classement et ce que chacun des CI
/CS
, AS
/AI
, KS
et WS
signifient, ainsi que BIN
/BIN2
et SC
(non illustré ci-dessus): Collation .
Et selon les caractères que vous devez stocker, vous devrez peut-être porter une attention particulière aux classements se terminant par SC
(c'est-à-dire "Caractères supplémentaires"). Par défaut, les données NCHAR
/NVARCHAR
sont stockées sous la forme UCS-2
, qui est très similaire à UTF-16
, mais UCS-2
est toujours de 2 octets par caractère. D'autre part, UTF-16
, afin de prendre en charge plus de 65 536 caractères (taille maximale de 2 octets ou UInt16.MaxValue
+ 1) peut stocker des caractères de 4 octets (appelés "paires de substitution"). Veuillez consulter la page MSDN suivante sur Collation et prise en charge Unicode (section "Caractères supplémentaires") pour plus de détails.
Faites absolument pas utilisez NTEXT
. Cela est obsolète depuis la sortie de SQL Server 2005! Il n'y a aucun avantage/raison de l'utiliser et, en fait, il y a plusieurs inconvénients.
[~ # ~] mise à jour [~ # ~]
Bien que cela ne soit pas idéal, il est possible de stocker des caractères japonais dans les champs et les variables CHAR
/VARCHAR
. Pour ce faire, le classement par défaut de la base de données doit être défini sur celui associé à la page de codes 932 (Shift-JIS). Vous pouvez trouver cette liste de classements en exécutant la requête suivante:
SELECT col.name
FROM sys.fn_helpcollations() col
WHERE COLLATIONPROPERTY(col.name, 'CodePage') = 932;
J'ai fait un test simple en créant une base de données avec une entrée de cette liste et j'ai exécuté les instructions suivantes:
SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation'); -- Japanese_Unicode_CI_AS
SELECT COLLATIONPROPERTY(N'Japanese_Unicode_CI_AS', 'CodePage'); -- 932
SELECT CONVERT(VARCHAR(50), 0x944094B294CD985198EE9AD79AA0); -- 如抜範浪偃壅國
SELECT LEN('如抜範浪偃壅國'), DATALENGTH('如抜範浪偃壅國'); -- 7, 14
Cela fonctionne car la page de codes 932 est un jeu de caractères à deux octets (DBCS), qui est différent de UCS-2/UTF-16 qui est également à deux octets. Un jeu de caractères DBCS est un jeu de caractères à deux octets dans un codage 8 bits (comme les pages de code étendues ASCII). Vous pouvez voir dans cette dernière requête que le DATALENGTH
est deux fois le caractère LEN
gth et que les données sont de type VARCHAR
car il n'y a pas de préfixe N
sur les littéraux de chaîne et CONVERT
était à VARCHAR
, pas NVARCHAR
. Il existe 4 pages de codes DBCS prises en charge dans Windows/SQL Server:
Utilisez-les uniquement si vous en avez absolument besoin, comme la prise en charge de l'interaction avec un système hérité. Bien sûr, les classements sont toujours bien à utiliser, mais stockez les données dans NVARCHAR
au lieu de VARCHAR
.