إنشاء ملف في Java للتحميل في حقل NVARCHAR في SQLServer 2005 باستخدام BCP و UTF-16
-
20-09-2019 - |
سؤال
أريد تحميل BCP إلى جدول SQL Server 2005 مع حقل NVARCHAR باستخدام ملف تحكم Loader. كما أفهمها، يدعم SQL Server 2005 فقط UTF-16 (وأعتقد أنه UTF-16 LE). يتم إخراج الملف بواسطة برنامج Java. الطريقة التي أقامت بها حاليا هي كما يلي:
ملف تحميل بتنسيق XML (تم إنشاؤه باستخدام الأمر التالي:
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
لقد جربت بعض التباديل مختلفة من المعلمات المتغيرة:
- تغيير الطريقة التي قمت بإنشاء ملف تحكم المحمل (باستخدام -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();