Oracle Text ne fonctionnera pas avec NVARCHAR2. Quoi d'autre pourrait être indisponible?

Nous allons migrer une application pour qu'elle prenne en charge Unicode et qu'elle doive choisir entre un jeu de caractères unicode pour l'ensemble de la base de données ou des colonnes unicode stockées dans N[VAR]CHAR2.

Nous savons que nous n'aurons plus la possibilité d'indexer le contenu des colonnes avec Oracle Text si nous choisissons NVARCHAR2, car Oracle Text ne peut indexer que les colonnes en fonction du type CHAR.

En dehors de cela, est-il probable que d'autres différences majeures surviennent lors de la récolte d'Oracle possibilités?

En outre, est-il probable que de nouvelles fonctionnalités soient ajoutées dans les nouvelles versions D'Oracle, mais ne prennent en charge que les colonnes CHAR ou nchar, mais pas les deux?

Je vous Remercie pour vos réponses.

Note suivant la réponse de Justin:

Je vous Remercie pour votre réponse. Je vais discuter de vos points, appliqués à notre cas:

Notre application est généralement seule sur la base de données Oracle et prend en charge le de données elle-même. D'autres logiciels qui se connectent à la base de données limité au Crapaud, Tora ou développeur SQL.

Nous utilisons également SQL * Loader et SQL*plus pour communiquer avec la base de données de base instructions ou pour mettre à niveau entre les versions du produit. Nous avons pas entendu parler d'un problème spécifique avec tous ces logiciels concernant NVARCHAR2.

Nous ne savons pas non plus que les administrateurs de bases de données parmi nos clients comme pour utiliser d'autres outils sur la base de données qui ne pouvaient pas prendre en charge les données sur NVARCHAR2 et nous ne sommes pas vraiment concernés si leurs outils pourrait perturber, après tout, ils sont compétents dans leur travail et peuvent trouver d'autres outils si nécessaire.

Vos deux derniers points sont plus perspicaces pour notre cas. Nous n'utilisons pas beaucoup paquets intégrés d'Oracle mais cela arrive toujours. Nous allons explorer cela problème.

Pourrions-nous également attendre une rupture de performance si notre application (qui est compilée sous Visual C++), qui utilise wchar_t pour stocker UTF-16, doit effectuer des conversions d'encodage sur toutes les données traitées?

21
demandé sur Benoit 2010-12-09 20:07:07

1 réponses

Si vous avez quelque chose proche d'un choix, utilisez un jeu de caractères Unicode pour l'ensemble de la base de données. La vie en général est juste aveuglément plus facile de cette façon.

  • Il existe de nombreux utilitaires et bibliothèques tiers qui ne prennent tout simplement pas en charge les colonnes NCHAR/ NVARCHAR2 ou qui ne rendent pas le travail avec les colonnes nchar/ nvarchar2 agréable. C'est extrêmement ennuyeux, par exemple, lorsque votre nouvel outil de reporting brillant ne peut pas signaler vos données NVARCHAR2.
  • pour les applications personnalisées, travail avec les colonnes nchar / NVARCHAR2, il faut sauter à travers certains cerceaux, ce qui n'est pas le cas avec les colonnes codées Unicode CHAR/ VARCHAR2. Dans le code JDBC, par exemple, vous appelez constamment l'instruction.méthode setFormOfUse. D'autres langages et cadres auront d'autres pièges; certains seront relativement bien documentés et d'autres mineurs seront relativement obscurs.
  • de nombreux paquets intégrés n'accepteront (ou ne retourneront) QU'un VARCHAR2 plutôt qu'un NVARCHAR2. Vous pourrez toujours les appeler en raison de la conversion implicite, mais vous pouvez vous retrouver avec des problèmes de conversion de jeu de caractères.
  • en général, être capable d'éviter les problèmes de conversion de jeu de caractères dans la base de données et de reléguer ces problèmes à la périphérie où la base de données envoie ou reçoit des données d'un client facilite grandement le développement d'une application. Il suffit de travailler pour déboguer les problèmes de conversion de jeu de caractères résultant de la transmission réseau-déterminer que certaines données ont été corrompues lorsqu'un procédure stockée les données concaténées d'un VARCHAR2 et D'un NVARCHAR2 et stockées le résultat dans un VARCHAR2 avant qu'il ne soit envoyé sur le réseau peuvent être atroces.

Oracle a conçu les types de données NCHAR/ NVARCHAR2 pour les cas où vous essayez de prendre en charge les applications héritées qui ne prennent pas en charge Unicode dans la même base de données que les nouvelles applications qui utilisent Unicode et pour les cas où il est avantageux de stocker des données Unicode avec un encodage différent (c'est-à-dire de données japonaises que vous préférez stocker en utilisant L'encodage UTF-16 dans un nvarchar2 plutôt que L'encodage UTF-8). Si vous n'êtes pas dans l'une de ces deux situations, et que cela ne semble pas être le cas, j'éviterais à tout prix NCHAR/ NVARCHAR2.

Répondre à vos suivis

Notre application est généralement seule sur la base de données Oracle et prend en charge les données lui-même. D'autres logiciels se connecter à la base de données sont limités à Crapaud, Tora ou SQL développeur.

Que voulez-vous dire "prend soin des données elles-mêmes"? J'espère que vous ne dites pas que vous avez configuré votre application pour contourner les routines de conversion de jeu de caractères D'Oracle et que vous effectuez vous-même toute la conversion de jeu de caractères.

Je suppose également que vous utilisez une sorte D'API / bibliothèque pour accéder à la base de données même si C'est OCI. Avez-vous examiné les modifications que vous devrez apporter à votre application pour prendre en charge NCHAR/ NVARCHAR2 et si le API que vous utilisez prend en charge nchar / NVARCHAR2? Le fait que vous obteniez des données Unicode en C++ n'indique pas réellement que vous n'aurez pas besoin de faire des modifications (potentiellement significatives) pour prendre en charge les colonnes NCHAR/ NVARCHAR2.

Nous utilisons également SQL * Loader et SQL * Plus pour communiquer avec la base de données pour instructions de base ou pour mettre à niveau entre les versions du produit. Nous n'avons pas entendu parler de tout problème spécifique avec tous ces logiciels concernant NVARCHAR2.

Ceux les applications fonctionnent toutes avec NCHAR/ NVARCHAR2. NCHAR / NVARCHAR2 introduisent des complexités supplémentaires dans les scripts, en particulier si vous essayez d'encoder des constantes de chaîne qui ne sont pas représentables dans le jeu de caractères de la base de données. Vous pouvez certainement contourner les problèmes, cependant.

Nous ne savons pas non plus que la base de données administrateurs parmi nos clients souhaitez utiliser d'autres outils sur le base de données qui n'a pas pu prendre en charge les données sur NVARCHAR2 et nous ne sommes pas vraiment soucieux de savoir si leurs outils pourraient perturber, après tout, ils sont qualifiés en leur travail et peut trouver d'autres outils si nécessaire.

Bien que je sois sûr que vos clients peuvent trouver d'autres façons de travailler avec vos données, si votre application ne fonctionne pas bien avec leur outil de reporting d'entreprise ou leur outil ETL d'entreprise ou les outils de bureau avec lesquels ils sont expérimentés, il est très probable que le client blâmera votre application plutôt que leurs outils. Il ne sera probablement pas un bouchon de spectacle, mais il n'y a pas non plus d'avantage à causer le chagrin des clients inutilement. Cela ne les poussera peut-être pas à utiliser le produit d'un concurrent, mais cela ne les rendra pas désireux d'adopter votre produit.

Pourrions-nous également nous attendre à des performances rupture si notre application (c'est-à-dire compilé sous Visual C++), qui utilise wchar_t pour stocker UTF-16, doit effectuer des conversions d'encodage sur tous données traitées?

Je ne suis pas sûr de ce que vous êtes "conversions" parle. Cela peut revenir à ma question initiale de savoir si vous indiquez que vous contournez la couche NLS D'Oracle pour effectuer la conversion de jeu de caractères par vous-même.

Mon résultat, cependant, est que je ne vois aucun avantage à utiliser NCHAR / NVARCHAR2 compte tenu de ce que vous décrivez. Il y a beaucoup d'inconvénients potentiels à les utiliser. Même si vous pouvez éliminer 99% des inconvénients comme non pertinents à vos besoins particuliers, cependant, vous êtes toujours confronté à une situation où au mieux c'est un lavage entre les deux approches. Compte tenu de cela, je préfère aller avec l'approche qui maximise la flexibilité à l'avenir, et qui convertit la base de données entière en Unicode (AL32UTF8 vraisemblablement) et juste en utilisant cela.

29
répondu Justin Cave 2010-12-10 17:18:13