Вы находитесь на страницах старой версии сайта.
Переходите на новую версию Interface.Ru

FAQ по ORACLE


Проблемы кодировки

  • Как получить в Oracle список всех первичных ключей в виде: [id_column], [id_table]?
  • Как правильно выбрать кодовую страницу при инсталляции?
  • Как можно решить проблемы, связанные с неверно заданной кодовой страницей?


  • Вопрос: Подскажите, как получить в Oracle список всех первичных ключей в виде: [id_column], [id_table]

    Ответ: select col.column_name,con.table_name from user_constraints con,user_cons_columns col where col.constraint_name=con.constraint_name and con.constraint_type='P';

    Это будет поименный перечень. Идентификаторы таблиц можно взять из user_tables, а столбцов - из user_tab_columns.


    Вопрос:Как правильно выбрать кодовую страницу при инсталляции?

    Ответ: Cпособы корректной установки поддержки национальных кодировок и стандартов в продуктах Oraclе обсуждались в статье С. Мосина [Oracle Magazine/Russian Edition номер 1 за лето 1996]

    При инсталляции необходимо выбирать "Русский", даже если это пробная установка.

    Однако часто еще встречаются СУБД Oracle с установленной CHARSET=WE8ISO8859P1 по умолчанию. Иногда это делается по незнанию, чаще с мыслью, что эта инсталляция временна, никогда не поздно будет изменить; а некоторые версии, например, распространявшаяся через Интернет trial версия Personal Oracle for Windows 3.1, не имели локальных кодировок.

    Когда при этом реально возникают проблемы:

    К сожалению Oracle Corp. не предусмотрела легальных (документированных) способов изменения кодировок СУБД и приложений


    Вопрос:Как можно решить проблемы, связанные с неверно заданной кодовой страницей?

    Ответ:

    1. Изменение DATABASE CHARSET

      Перекодировки данных здесь не происходит, изменяется только пометка для Oracle. Вы должны точно представлять в какой кодировке ваши данные находятся.

      Прежде, чем использовать этот метод проверьте, присутствует ли необходимая вам кодировка в списке допустимых :

      SQL> select value from V$NLS_VALID_VALUES

    2. where parameter='CHARACTERSET'
    3. and (value like 'RU%' or value like 'CL%')

      VALUE


      CL8ISO8859P5

      RU8PC866

      RU8BESTA

      RU8PC855

      CL8MACCYRILLIC

      CL8MACCYRILLICS

      CL8MSWIN1251

      CL8EBCDIC1025

      CL8EBCDIC1025X

      CL8BS2000

      Текущие установки NLS БД можно просмотреть используя view NLS_DATABASE_PARAMETERS. Что представляет из себя это view?

      SQL> select text from dba_views where view_name='NLS_DATABASE_PARAMETERS';

      TEXT


      select name,

      substr(value$, 1, 30)

      from props$

      where name like 'NLS%'

      PROPS$ - это fixed table, где хранится информация об NLS и не только. Несмотря на термин fixed на многих версиях Oracle позволяет производить UPDATE над ней (хотя не во всех - какие-то версии Personal Oracle не допускают этого). Допустим Вы имеете WE8ISO8859P1, а Вам нужно CL8MSWIN1251.

      SQL> select * from props$ where name='NLS_CHARACTERSET';

      NAME VALUE$ COMMENT$


      NLS_CHARACTERSET WE8ISO8859P1 Character set

      SQL> update props$ set VALUE$='CL8MSWIN1251' where name='NLS_CHARACTERSET';

      1. row updated.

        SQL> select * from props$ where name like 'NLS_CHARACTERSET';

        NAME VALUE$ COMMENT$


        NLS_CHARACTERSET CL8MSWIN1251 Character set

        SQL> commit;

        Commit complete.

        И после этого остается только поменять переменную среды NLS_LANG на сервере и клиентах и спокойно наслаждаться видом неизвращенных "Я" и "Ч" как больших так и маленьких.

      2. Использование Export - Import

        Как решить проблемы, возникающие при осуществлении экспорта в системе с кодировкой WE8ISO8859P1, а импорта на системе с русской кодировкой?

        Использование параметра CHARSET применимо для импорта данных из версий ранее 7 (Oracle 5, 6). Экспортный файл версии 7 содержит в себе информацию о кодировке данных, из-за чего и возникают проблемы. Как же этого избежать?

        Ответ заключается всего в одном байте экспортного файла, а именно - в третьем (точнее в двух байтах – втором и третьем, но в наших случаях второй байт равен 0x00), где и находится идентификатор CHARSET.

        Таблица . Идентификаторы CHARSET.
         
        Кодировка CS_ID(hex)  CS_ID(dec) NLS RTL 3.1 Windows NLS RTL 3.2 Windows модуль из libnlsrtl.a *
        US7ASCII 0x01 1 lx20001.d lx20001.nlb lic001.o
        WE8ISO8859P1  0x1F 31 x2001F.d lx2001F.nlb lic031.o
        CL8ISO8859P5  0x23  35 lx20023.d lx20023.nlb lic035.o
        RU8PC866  0x98  152  lx20098.d  lx20098.nlb  lic152.o
        RU8BESTA 0x99  153  lx20099.d lx20099.nlb lic153.o 
        RU8PC855  0x9B 155 lx2009B.d  lx2009B.nlb lic155.o 
        CL8MACCYRILLIC  0x9E  158 lx2009E.d lx2009E.nlb lic158.o 
        CL8MACCYRILLICS  0x9F 159  lx2009F.d lx2009F.nlb lic159.o
        CL8MSWIN1251  0xAB  171  lx200AB.d lx200AB.nlb lic171.o 
        CL8EBCDIC1025  0xB9  185 lx200B9.d lx200B9.nlb lic185.o 
        CL8EBCDIC1025X  0xBA  186  lx200BA.d lx200BA.nlb  
        CL8BS2000  0Xeb 235  lx200EB.d lx200EB.nlb lic235.o
        *- для Oracle 7.1.4 SCO Unix (в других версиях может отличаться)

        Необходимо изменить этот байт с помощью любого шестнадцатеричного редактора.

        Советы Игоря Филимонова ЛАСУ ТРИНИТИ, г. Троицк (Oracle Club)

        Описанные методы применялись на версиях 7.1.4 - 7.2.2 для Windows 95, Windows NT, SCO Unix и.oracle 7.3 для HP/UX. Перед их использованием сделайте full export (backup).


    За дополнительной информацией обращайтесь в компанию Interface Ltd.

    Обсудить на форуме Oracle

    Рекомендовать страницу

    INTERFACE Ltd.
    Телефон/Факс: +7 (495) 925-0049
    Отправить E-Mail
    http://www.interface.ru
    Rambler's Top100
    По техническим вопросам обращайтесь к вебмастеру