BCP 및 UTF-16을 사용하여 SQLSERVER 2005의 NVARCHAR 필드에로드하기 위해 Java로 파일을 만듭니다.
-
20-09-2019 - |
문제
BCP를 사용하여 로더 제어 파일을 사용하여 NVarchar 필드가있는 SQL Server 2005 테이블에로드하고 싶습니다. 내가 이해 한 바와 같이, SQL Server 2005는 UTF-16 만 지원합니다 (그리고 UTF-16 LE라고 생각합니다). 파일은 Java 프로그램에 의해 출력되고 있습니다. 현재 설정 한 방식은 다음과 같습니다.
XML 형식 BCP 로더 파일 (다음 명령을 사용하여 생성되었습니다.
bcp test_table format nul -c -x -T -f test_table.xml -S server
)출력을 작성하기 위해 다음 코드를 사용하는 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();
그런 다음 다음 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();