BCP 및 UTF-16을 사용하여 SQLSERVER 2005의 NVARCHAR 필드에로드하기 위해 Java로 파일을 만듭니다.

StackOverflow https://stackoverflow.com/questions/2246355

문제

BCP를 사용하여 로더 제어 파일을 사용하여 NVarchar 필드가있는 SQL Server 2005 테이블에로드하고 싶습니다. 내가 이해 한 바와 같이, SQL Server 2005는 UTF-16 만 지원합니다 (그리고 UTF-16 LE라고 생각합니다). 파일은 Java 프로그램에 의해 출력되고 있습니다. 현재 설정 한 방식은 다음과 같습니다.

  1. XML 형식 BCP 로더 파일 (다음 명령을 사용하여 생성되었습니다.bcp test_table format nul -c -x -T -f test_table.xml -S server)

  2. 출력을 작성하기 위해 다음 코드를 사용하는 Java 프로그램 :

    File f = new File("from_java.txt");
    String encoding = "x-UTF-16LE-BOM";
    OutputStream os = new FileOutputStream(f);
    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(os, encoding);
    String theString = "áááááLittle Endian, BOM\r\n";
    outputStreamWriter.append(theString);
    outputStreamWriter.flush();
    outputStreamWriter.close();
    
  3. 그런 다음 다음 BCP 명령을 사용합니다.
    bcp test_table in from_java.txt -T -f test_table.xml -S server -error error.txt

내가 테이블에서 얻는 것은입니다 ÿþá. 그리고 아닙니다 áááááLittle Endian, BOM

변경 매개 변수의 몇 가지 다른 순열을 시도했습니다.

  • 로더 컨트롤 파일을 생성하는 방법 변경 (문자 데이터에 -C 대신 -C 대신 -C에 -N을 사용합니다 ... 이것은 그것과 관련이있을 수 있지만 삽입 된 데이터의 개선이 보이지 않았다고 생각합니다).
  • Big Endian과 Bom이없는 Little Endian을 포함하여 몇 가지 다른 형태의 UTF-16 인코딩을 시도했습니다.
  • Microsoft가 BOM 정보를 사용하는 것을 좋아하는 곳을 읽을 때 파일에서 BOM을 수동으로 출력하려고했습니다.
  • 파일을 UCS-2 (UTF-16 대신)로 출력하려고 시도하는 것을 보았습니다.
  • BCP 가져 오기에서 -w를 시도했지만 이것은 작동하지만 로더 형식 파일과 함께 작동하지 않습니다 (BCP에게 파일이 UTF -16에서 포맷 파일에 인코딩 된 것을 BCP에게 알려주는 방법이 있습니까?)
  • Windows-1252에서 파일을 출력하고 해당 CodePage를 -c 1252 파일을로드 할 때 BCP에 대한 옵션 (그러나 UTF-16이 1252에 비해 표현할 수있는 대체의 수퍼 세트 이므로이 작업을 수행하고 싶지 않습니다).

로더 형식 구성 파일과 함께 UTF-16 데이터를 사용하여 BCP를 NVARCHAR 필드에로드 할 수있는 사람이 있습니까?

미리 감사드립니다.

-제임스

도움이 되었습니까?

해결책

나는 말 그대로 반응에 압도 당했지만 그것을 깨뜨렸다.

로더 파일은 a로 생성해야합니다 -w 플래그, 따라서 파일을 생성하는 명령은 다음과 같습니다.

bcp <table> format nul -w -x T -f loader-control-w-format.xml -S <server> -t "||"

이것은 약간 다르게 보이는 로더 제어 파일로 이어지면 다음과 같은 항목이 나타납니다.

<FIELD ID="1" xsi:type="NCharTerm" TERMINATOR="|\0|\0" MAX_LENGTH="1000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>

참고 구분 기는 다음과 같이 표시됩니다 |\0|\0, 0은 파일의 추가 바이트에 해당합니다 (또는 Microsoft (잘못된)는 Double Byte 캐릭터 인코딩입니다.

이런 식으로 BCP를 다루는 다른 사람의 세력에 대한 일부 메모 :

  • sqlserver가 "Native"에 대해 이야기 할 때, 그들은 원주민 캐릭터, 즉 악센트가있는 캐릭터를 의미합니다.
  • sqlserver가 유니 코드에 대해 이야기 할 때, 그들이 실제로 의미하는 바는 UTF16 (Little Endian)이 인코딩하는 방식입니다. 유니 코드 문자 세트. 이것이 -w가 관련된 것입니다
  • UTF-16을 사용하여 BCP에로드하기위한 파일을 작성할 때 파일은 UTF-16 Little Endian 형식이어야하며 UTF BOM을 포함 할 수 없습니다 (BCP는이 바이트를로드 해야하는 바이트를 해석하고 첫 번째 레코드가 포함되어 있습니다. Bom, urgh!)

이러한 방식으로로드 할 수있는 UTF-16에서 파일을 작성하기위한 Java 코드는 다음과 같습니다.

    final File f = new File("C:\\temp\\bcp_prob\\from_java-UTF-16.txt");
    //LE with no BOM is important here:
    final String encoding = "UTF-16LE";
    final OutputStream os = new FileOutputStream(f);
    final OutputStreamWriter outputStreamWriter = new OutputStreamWriter(os, encoding);
    final String theString = "UTF-16-LE, intermetálico básicos intermetálico película magnética dinámicos||another_col\r\n";        
    outputStreamWriter.append(theString);
    outputStreamWriter.flush();
    outputStreamWriter.close();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top