Как сохранить unicode данные оракулу?

@Greg: кажется, что Вы отредактировали свой ответ, чтобы быть совершенно другим ответом. К которому мой ответ да, я мог сделать это использование System.Xml, но надеялся намочить ноги с LINQ к XML.

я оставлю свой исходный ответ ниже в случае, если кто-либо еще задается вопросом, почему я не могу только использовать.Value свойство XELEMENT для получения то, в чем я нуждаюсь:

@Greg: свойство Value связывает все текстовое содержание любых дочерних узлов. Таким образом, если элемент тела содержит только текст, это работает, но если это содержит XHTML, я получаю весь текст, связанный вместе, но ни один из тегов.

6
задан Glorfindel 1 April 2019 в 19:59
поделиться

3 ответа

Я вижу пять потенциальных областей для проблем:

  1. Как вы на самом деле вводите текст в свое .NET-приложение? Если он жестко задан строковым литералом, уверены ли вы, что компилятор принимает правильную кодировку для вашего исходного файла?

  2. Может быть проблема в том, как вы отправляете его в базу данных.

  3. Может быть проблема с тем, как он хранится в базе данных.

  4. Может быть проблема с тем, как вы его загружаете в базу данных.

  5. Может быть проблема с тем, как вы потом снова его отображаете.

Теперь области 2-4 звучат так, как будто они менее вероятны, чем 1 и 5. Как вы затем отображаете текст? Вы на самом деле извлекаете его из базы данных в .NET, или вы используете Toad или что-то подобное, чтобы попытаться увидеть это?

Если вы ' переписывая его снова из .NET, я предлагаю вам полностью пропустить базу данных - если вы просто отобразите саму строку, что вы увидите?

У меня есть статья, которая может оказаться полезной по отладке проблем Unicode . В частности, сосредоточьтесь на каждом месте, где кодировка может работать неправильно, и убедитесь, что всякий раз, когда вы «отображаете» строку, вы выгружаете точные символы Unicode (как целые числа), чтобы вы могли проверить их, а не только то, что ваш текущий шрифт хочет отобразить.

РЕДАКТИРОВАТЬ: Хорошо, значит, база данных где-то участвует в проблеме.

Я настоятельно предлагаю вам удалить что-нибудь вроде ASP и HTML вне уравнения. Напишите простое консольное приложение, которое ничего не делает, кроме вставки строки и повторного получения ее. Сделайте дамп отдельных символов Unicode (в виде целых чисел) до и после. Затем попробуйте посмотреть, что находится в базе данных (например, с помощью Toad). Я не знаю функций Oracle для преобразования строк в последовательности отдельных символов Unicode и последующего преобразования этих символов в целые числа, но это, вполне возможно, будет следующим, что я попробую.

РЕДАКТИРОВАТЬ: Еще два предложения (подходит для см. приложение консоли, кстати).

  1. Укажите тип данных для параметра, а не просто укажите ему объект. Например:

     command.Parameters.Add (": UnicodeString", но вполне возможно, что это будет следующее, что я попробую. 

    РЕДАКТИРОВАТЬ: еще два предложения (приятно видеть консольное приложение, кстати).

    1. Укажите тип данных для параметра, а не просто задавайте ему объект. Например:

       command.Parameters.Add (": UnicodeString", но вполне возможно, что это будет следующее, что я попробую. 

      РЕДАКТИРОВАТЬ: еще два предложения (приятно видеть консольное приложение, кстати).

      1. Укажите тип данных для параметра, а не просто задавайте ему объект. Например:

         command.Parameters.Add (": UnicodeString",
         OracleType.NVarChar) .Value = stringToSave;
        
      2. Рассмотрите возможность использования собственного драйвера Oracle вместо встроенного в .NET. Вы можете захотеть сделать это в любом случае, поскольку, как я полагаю, это обычно считается более быстрым и надежным.

6
ответ дан 10 December 2019 в 00:42
поделиться

Вы можете определить, какой набор символов ваша база данных использует для NCHAR с помощью запроса:

SQL> SELECT VALUE
  2    FROM nls_database_parameters
  3   WHERE parameter = 'NLS_NCHAR_CHARACTERSET';

VALUE
------------
AL16UTF16

, чтобы проверить правильность конфигурации вашей базы данных, вы можете запустить в SQL * Plus следующее:

SQL> CREATE TABLE unicodedata (ID NUMBER, unicodestring NVARCHAR2(100)); 

Table created
SQL> INSERT INTO unicodedata VALUES (11, 'Τι κάνεις;');

1 row inserted
SQL> SELECT * FROM unicodedata;

        ID UNICODESTRING
---------- ---------------------------------------------------
        11 Τι κάνεις;
2
ответ дан 10 December 2019 в 00:42
поделиться

Еще одна вещь, на которую стоит обратить внимание.

Если вы используете клиент oracle и хотите включить символы Юникода в CommandText, вам следует добавить следующую строку в начало вашего приложения:

System.Environment.SetEnvironmentVariable("ORA_NCHAR_LITERAL_REPLACE", "TRUE");

Это позволит вам, в случае необходимости, использовать следующий синтаксис:

command.CommandText = "INSERT into UNICODEDATA (ID, UNICODESTRING) Values (11, N'Τι κάνεις;')";
1
ответ дан 10 December 2019 в 00:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: