Проблемы с набором символов в Oracle Gateways, SQL Server и Application Express
Я переносу данные из Oracle на VMS, которая обращается к данным на SQL Server с использованием гетерогенных служб (через ODBC), в Oracle на AIX, получая доступ к SQL Server через шлюзы Oracle (dg4msql). База данных Oracle VMS использовала набор символов WE8ISO8859P1. База данных AIX использует WE8MSWIN1252. База данных SQL Server использует "Latin1-General, регистр-нечувствительный, регистр-нечувствительный, канатип-нечувствительный, нечувствительный к ширине для данных Unicode, порядок сортировки SQL Server 52 на кодовой странице для данных не-Unicode" в соответствии с sp_helpsort. В базах данных SQL Server используются nchar/nvarchar или все строковые столбцы.
В Application Express в некоторых случаях появляются дополнительные символы, например, 123 отображается как%001%002%003. В sqlplus все выглядит хорошо, но если я использую функции Oracle, такие как initcap, я вижу то, что появляется в виде пробелов между каждой буквой строки, когда я запрашиваю базу данных сервера sql (используя ссылку на базу данных). Это не происходило при старой конфигурации.
Я предполагаю, что проблема заключается в том, что nchar содержит дополнительные байты, а набор символов в Oracle не может его преобразовать. Похоже, что решение ODBC не поддерживало nchars, поэтому, должно быть, просто вернуло их обратно в char, и они появились нормально. Мне нужно только просмотреть данные сервера SQL, поэтому я открыт для любого решения, такого как приведение, но я не нашел ничего, что работает.
Есть идеи как с этим бороться? Должен ли я использовать другой набор символов в Oracle и, если да, применимо ли это ко всем схемам, поскольку меня интересует только одна из них.
Обновление: я думаю, что могу упростить этот вопрос. Таблица SQL Server использует nchar. выберите дамп (столбец) из таблицы возвращает Typ=1 Len=6: 0,67,0,79,0,88, когда значение равно 'COX', выбираю ли я из удаленной ссылки на сервер SQL, приведение литерала 'COX' к nvarchar или скопируйте в таблицу Oracle как nvarchar. Но когда я выбираю сам столбец, он появляется с дополнительными пробелами только при выборе ссылки удаленного сервера SQL. Я не могу понять, почему dump будет возвращать то же самое, но если не использовать dump, то будут показаны разные значения. Любая помощь приветствуется.
2 ответа
В этой конкретной версии SQL Server существует несовместимость между шлюзами Oracle и nchar. Решением было создание представлений на стороне SQL Server, приводящих nchars к varchars. Затем я мог выбирать из представлений через шлюзы, и он правильно обрабатывал наборы символов.