2

Я добавил связанный сервер PostgreSQL на свой SQL Server с помощью this blog post. Моя проблема в том, что когда я использую запрос ниже, у меня проблемы с турецкими персонажами.SQL Server Linked Server to PostgreSQL Турецкий символ Проблема

Запрос на Microsoft SQL Server 2012:

SELECT * 
FROM OpenQuery(CARGO, 'SELECT taxno ASACCOUNTNUM, title AS NAME FROM view_company'); 

Фактические результаты:

MUSTAFA ÞAHÝNALP

Ожидаемые результаты:

MUSTAFA ŞAHİNALP

+0

Что такое сервер сортировки? Каков тип заголовка на сервере PostgreSQL? Попробуйте '' SELECT taxno ASACCOUNTNUM, CONVERT (NVARCHAR (128), название) AS NAME FROM view_company'' – scsimon

+0

view_company, расположенный в базе данных PostgreSQL, поэтому при использовании запроса выберите * из view_company в pgAdmin, результаты вернутся правильно. Моя проблема в том, что когда я использую выше запрос в MS Sql, у меня проблемы с турецкими персонажами. –

+0

Как настроен связанный сервер? Включено ли 'использование сортировки серверов '? –

ответ

0

Проблема заключается в том, что исходное кодирование является 8-разрядным расширенным ASCII с использованием кода Page 1254 - Windows Latin 5 (Turkish). Если вы перейдете по этой ссылке, вы увидите символы символов Latin5. Значение знака Ş - «Письмо Латинской столицы S с Cedilla» - (Десятичный)/DE (Hex). На вашем локальном сервере (т. Е. SQL Server) есть значение по умолчанию: SQL_Latin1_General_CP1_CI_AS, которое также является 8-разрядным расширенным ASCII, но с использованием кода Page 1252 - Windows Latin 1 (ANSI). Если вы перейдете по этой ссылке, вы увидите диаграмму Latin1, которая отобразит символ Þ - «Латинский буквенный буклет письма», также имеющий значение (десятичный)/DE (Hex). Вот почему ваши персонажи переводятся таким образом.

Есть несколько вещей, которые вы можете попробовать:

  1. Использование sp_serveroption установить следующие два варианта:

    EXEC sp_serveroption @server=N'linked_server_name', 
            @optname='use remote collation', 
            @optvalue=N'true'; 
    
    EXEC sp_serveroption @server=N'linked_server_name', 
            @optname='collation name', 
            @optvalue=N'Turkish_100_CI_AS'; 
    

    Не уверен, что будет работать с PostgreSQL в качестве удаленной системы, но это стоит попробовать хотя бы. Обратите внимание, что это требует, чтобы все удаленные сортировки столбцов устанавливается на эту особую ценность: турецкий/кодовой страницы 1254.

  2. Force по сопоставлению за каждую колонку:

    SELECT [ACCOUNTNUM], [NAME] COLLATE Turkish_100_CI_AS 
    FROM OPENQUERY(CARGO, 'SELECT taxno AS ACCOUNTNUM, title AS NAME FROM view_company'); 
    
  3. Преобразовать строковые значения (только те, с проблемами отображения символов) в VARBINARY и вставить во временную таблицу, где столбец устанавливается в соответствующий: разбор по копиям

    CREATE TABLE #Temp ([AccountNum] INT, [Name] VARCHAR(100) COLLATE Turkish_100_CI_AS); 
    
    INSERT INTO #Temp ([AccountNum], [Name]) 
        SELECT [ACCOUNTNUM], CONVERT(VARBINARY(100), [NAME]) 
        FROM OPENQUERY(CARGO, 'SELECT taxno AS ACCOUNTNUM, title AS NAME FROM view_company'); 
    
    SELECT * FROM #Temp; 
    

    Этот подход будет сначала преобразовать входящие символы в thei r двоичное/шестнадцатеричное представление (например, Ş - > 0xDE), а затем, при вставке 0xDE в VARCHAR столбец в таблице темпа, он будет переводить 0xDE в ожидаемый характер этого значения для кодовой страницы 1254 (так как это Упорядочение этого столбца). Результат будет Ş вместо Þ.

UPDATE

Вариант № 1 работал на распродано

 Смежные вопросы

  • Нет связанных вопросов^_^