إنشاء ملف في Java للتحميل في حقل NVARCHAR في SQLServer 2005 باستخدام BCP و UTF-16

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

سؤال

أريد تحميل BCP إلى جدول SQL Server 2005 مع حقل NVARCHAR باستخدام ملف تحكم Loader. كما أفهمها، يدعم SQL Server 2005 فقط UTF-16 (وأعتقد أنه UTF-16 LE). يتم إخراج الملف بواسطة برنامج Java. الطريقة التي أقامت بها حاليا هي كما يلي:

  1. ملف تحميل بتنسيق XML (تم إنشاؤه باستخدام الأمر التالي: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

لقد جربت بعض التباديل مختلفة من المعلمات المتغيرة:

  • تغيير الطريقة التي قمت بإنشاء ملف تحكم المحمل (باستخدام -N للبيانات الأصلية بدلا من -C للحصول على بيانات الأحرف ... أعتقد أن هذا قد يكون له علاقة به، لكنني لم أر أي تحسن في بياناتي المدرجة)
  • حاول العديد من أشكال مختلفة من الترميز UTF-16، بما في ذلك الإندان الكبير والانيدي قليلا مع عدم وجود BOM، دون جدوى
  • حاول إخراج BOM يدويا في الملف وأنا قرأت في مكان ما ترغب Microsoft حقا في استخدام معلومات BOM
  • نظرت إلى محاولة إخراج الملف باسم UCS-2 (بدلا من UTF-16) كما هو (على ما يبدو) ما هي BCP قراءة الملف في الواقع
  • حاول على استيراد BCP، وهذا يعمل، ولكن ليس بالاقتران مع ملف تنسيق محمل (هل هناك طريقة لإدماج أي سحر يخبر BCP أن الملف مشفرة في UTF-16 في ملف التنسيق؟)
  • يمكنني الحصول عليه للعمل إذا قمت بإخراج الملف في نظام التشغيل Windows-1252 وحدد هذا المدمج ك -c 1252 خيار BCP عندما أقوم بتحميل الملف (لكنني لا أريد أن أفعل ذلك لأنني سأفقد معلومات ATF-16 عبارة عن وحدة UTF-16 هي مكبث ما يمكن تمثيله مقارنة ب 1252)

هل تمكن أي شخص من الحصول على BCP للتحميل في حقل NVARCHAR باستخدام بيانات UTF-16 بالتزامن مع ملف تكوين تنسيق مثالي؟

شكرا لك مقدما،

-جوامع

هل كانت مفيدة؟

المحلول

لقد غادرت حرفيا مع الاستجابات، لكنني قمت بتشويهها.

يحتاج ملف Loader إلى إنشاء مع -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, .

بعض الملاحظات لمعرفة أي شخص آخر يتعامل مع BCP بهذه الطريقة:

  • عندما يتحدث SQLServer "الأصلية"، تعني شخصيات أصلية، أي أحرف معلمة
  • عندما يتحدث SQLServer عن Unicode، فإن ما تعنيه فعلا هو طريقة OUTF16 (الإناث القليل) لترميز أحرف Unicode.. وبعد هذا هو ما يتعلق به
  • عند كتابة ملف للتحميل في BCP باستخدام UTF-16، يجب أن يكون الملف بتنسيق Enterian Little UTF-16، ولا يمكن أن يحتوي على BOM ل UTF (حيث سيتضمن BCP هذا البايت الذي يجب تحميله وسيتم احتواء سجلك الأول The BOM، Urgh!)

إن رمز جافا لكتابة ملف في UTF-16 الذي يمكن تحميله بهذه الطريقة هو كما يلي:

    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