مشكلة قراءة شخصيات خاصة من Teradata - JDBC
سؤال
يمكنني استخدام Teradata وإخراج الاستعلام أدناه "Altlüd" عند التشغيل باستخدام عميل Teradata.
select name as name from MYTABLE where selector=?
بينما ، أحصل على "Altl؟ D" كإخراج عندما أحاول تنفيذ الاستعلام باستخدام عميل Java (JDBC مع برامج تشغيل Teradata). أنا أستخدم "UTF-8" Charset وقد جربت أيضًا Charset اللاتينية بدون حظ.
لقد حاولت أيضا هذا لاستكشاف الأخطاء وإصلاحها.
while (rs.next()) {
System.out.println(rs.getString(1));
Reader rd = rs.getCharacterStream(1);
int charr = rd.read();
while (charr >= 0) {
System.out.println(charr + " = " + ((char) charr));
charr = rd.read();
}
}
والإخراج هو
altl؟ dersdorf 65 = a 108 = l 116 = t 108 = l 65533 =؟ 100 = د
إذا نظرت إلى الإخراج المنتجة ، فإن قيمة int لحرف SPL هي 65533 والتي لا ينبغي أن تكون هي الحالة.
إنفاكت إرجاع 65533 لجميع الشخصيات الخاصة.
سيتم تقدير أي أدلة/مؤشرات. شكرًا!!!
المحلول
يبدو أن حرف استبدال Unicode U+FFFD
. لا يستخدم عميل وخادم JDBC نفس الترميز للأحرف. يبدو أن العميل يحاول UTF-8 ، لكن الخادم يقدم أي تنسيق غير UTF.
لا أعرف Teradata ، لكن يجب أن تبحث عن أي قاعدة بيانات أو إعدادات خادم للترميز و/أو اللغة.
نصائح أخرى
حاول استخدام charset = UTF-16 كمعلمة جانب العميل.
طريقة واحدة سهلة هي ضبط lc_all = lang = en_us.utf-16 ثم قم بتشغيل برنامج Java الخاص بك.