2017-01-03 5 views
1

MySQL 데이터베이스에서 Microsoft SQL Server 데이터베이스 (SQL_Latin1_General_CP1_CI_AS)로 데이터를 가져옵니다. Openquery 문과 함께 OBDC 기반의 linkedserver 연결을 사용합니다. MS SQL - MySQL - Openquery 한자를 '?'로 가져 왔습니다.

나는 다음과 MS SQL 문을 사용

:

SELECT street_address FROM openquery(MYLINKEDSERVER,'SELECT street_address FROM customers') 

주소 중 일부는 한자를 포함, 이들은 물음표, 예를 결과로 가져 OPENQUERY 사용하는 경우 :

??? ??? 74? 501?

latin1을 사용하여 변환 해 보았습니다.

SELECT * FROM openquery(MYLINKEDSERVER,'SELECT convert(street_address using latin1) FROM customers') 

모든 아이디어를 MS SQL로 가져 오는 방법은 무엇입니까?

+1

'street_address'의 데이터 유형은'nvarchar'입니까? –

+0

mysql의 데이터 유형이 varchar – phicon

+0

이고 SQL Server?가 nvarchar이어야합니다 –

답변

1

두 ODBC 드라이버, 하나의 ANSI (myodbc5a.dll)와 하나의 유니 코드 (myodbc5w.dll을)이 있습니다. ANSI 드라이버는 항상 varchar 데이터를 반환합니다. 한자를 유니 코드로 반환하려면 유니 코드 드라이버를 사용해야합니다.

ODBC 드라이버의 설치 ​​페이지에서 relevant paragraphthis related question을 확인하십시오.

한 코드 페이지에서 다른 코드 페이지로 변환 할 때 알 수 없거나 표현할 수없는 문자는 ? 또는 유니 코드 대체 문자 replaced로 바뀝니다. 문자열의 이러한 문자는 잘못된 변환이 시도 된 확실한 기호입니다.

0

그래서 나는 그것을 잘 만들 수있었습니다.

  1. 변환은 OPENQUERY를 통해 SQL Server의
  2. 가져 오기
  3. NVARCHAR로 변환 VARCHAR의 UTF8 기능을 SQL 서버에 VARCHAR (최대)에
  4. 캐스트 사용
  5. MySQL의에서 이진 -> link

결과 쿼리;

SELECT dbo.func_utf_string(cast(bin AS varchar(MAX))) from openquery(MYLINKEDSERVER,'SELECT cast(street as binary) as bin from customers') 
+0

MySQL의 경우 UTF8로 캐스팅하고 그대로 SQL Server에 남겨 두는 것이 좋습니다. 즉,'nvarchar '? 원래 쿼리는'latin1'을 사용했습니다. bin으로의 캐스트가 작동했다면 데이터가 * Latin * 1이지만 UTF8이 아니기 때문입니다. 드라이버는 UTF8을 유니 코드로 변환하는 방법을 알고 있습니다. –

+0

드라이버는 * 모든 * 코드 페이지를 유니 코드로 변환하는 방법도 알고 있습니다. 단, 원본에서 올바른 코드를 사용하는 경우에 한합니다. 잘못된 코드 페이지를 사용하면 유효하지 않은 문자가'?'로 바뀝니다. 예를 들어 중국어가 'Latin1'데이터 정렬로 테이블에 저장된 경우 변환이 잘못되었습니다. 원본 열은 * UTF8이 아니며 전환도 위반했습니다. –

+0

내가 UTF8로 남겨두면 select가 중국어 문자를 지원하지 않는 varchar를 반환합니다. Linked Server의 코드 페이지 번역은 테스트하지는 않았지만 살펴볼 내용입니다. TY – phicon