Cela dépend de la manière dont Oracle a été installé. Pendant le processus d'installation, l'option NLS_CHARACTERSET est définie. Vous pouvez peut-être la trouver avec la requête SÉLECTIONNER value$ DE sys.props$ OÙ nom = 'NLS_CHARACTERSET'
.
Si votre NLS_CHARACTERSET est un encodage Unicode comme UTF8, génial. Utiliser VARCHAR et NVARCHAR est pratiquement identique. Arrêtez de lire maintenant, foncez. Sinon, ou si vous n'avez aucun contrôle sur l'ensemble de caractères Oracle, continuez à lire.
VARCHAR — Les données sont stockées dans l'encodage NLS_CHARACTERSET. Si d'autres instances de base de données sont sur le même serveur, vous pouvez être limité par elles ; et vice versa, puisque vous devez partager le paramètre. Un champ de ce type peut stocker toutes les données pouvant être encodées avec cet ensemble de caractères, et rien d'autre. Donc, par exemple si l'ensemble de caractères est MS-1252, vous ne pouvez stocker que des caractères comme des lettres anglaises, quelques lettres accentuées, et quelques autres (comme € et —). Votre application ne serait utile qu'à quelques régions, incapable de fonctionner ailleurs dans le monde. Pour cette raison, c'est considéré comme une mauvaise idée.
NVARCHAR — Les données sont stockées dans un codage Unicode. Toutes les langues sont prises en charge. Une bonne idée.
Qu'en est-il de l'espace de stockage ? VARCHAR est généralement efficace, car l'ensemble de caractères/l'encodage a été conçu sur mesure pour une région spécifique. Les champs NVARCHAR stockent soit en encodage UTF-8 soit en UTF-16, basé sur le paramètre NLS ironiquement. UTF-8 est très efficient pour les langues "occidentales", tout en prenant en charge les langues asiatiques. UTF-16 est très efficace pour les langues asiatiques, tout en prenant en charge les langues "occidentales". Si vous vous souciez de l'espace de stockage, choisissez un paramètre NLS pour que Oracle utilise UTF-8 ou UTF-16 selon ce qui est approprié.
Et concernant la vitesse de traitement ? La plupart des nouvelles plateformes de codage utilisent Unicode de manière native (Java, .NET, même std::wstring en C++ il y a des années !) donc si le champ de base de données est VARCHAR, cela oblige Oracle à convertir entre les ensembles de caractères à chaque lecture ou écriture, pas si bon. Utiliser NVARCHAR évite la conversion.
En conclusion : Utilisez NVARCHAR ! Cela évite les limitations et dépendances, est adéquat en termes d'espace de stockage, et généralement le meilleur pour la performance également.
6 votes
J'aime le point d'incomudro, c'est ce qui m'a amené à creuser la différence entre varchar & nvarchar en premier lieu. Notre application Java sur une base de données SQL Server utilise myBatis, qui semble envoyer des chaînes de caractères en nvarchar par défaut (je ne suis toujours pas sûr si c'est modifiable). Une requête simple posait un énorme problème de performances car j'avais défini la colonne sur laquelle elle sélectionne en tant que varchar, pas nvarchar, et elle ignorait l'index sur la colonne.