我有一个python脚本,其中我向Teradata服务器执行SQL查询。
我使用teradatasql python库来实现这一点:
conn = tdSQL.connect(logmech=logmech, host=host)
query = "SELECT * FROM table"
df = pandas.read_sql(query, conn)
而不是得到"希伯来语"列,我得到了"胡言乱语"列:
Hebrew Gibberish hebrew_char2hexint
0 אילת àéìú E0E9ECFA
1 אשדוד àùãåã E0F9E3E5E3
2 אשקלון àùœìåï E0F9F7ECE5EF
3 באר שבע áàø ùáò E1E0F820F9E1F2
4 בית שמש áéú ùîù E1E9FA20F9EEF9
5 בני ברק áÐé áøœ E1F0E920E1F8F7
6 דימונה ãéîåÐä E3E9EEE5F0E4
7 המשולש דרום äîùåìù ãøåí E4EEF9E5ECF920E3F8E5ED
8 המשולש צפון äîùåìù öôåï E4EEF9E5ECF920F6F4E5EF
9 הרצליה äøöìéä E4F8F6ECE9E4
10 חדרה çãøä E7E3F8E4
11 חולון çåìåï E7E5ECE5EF
12 חיפה çéôä E7E9F4E4
13 חצור הגלילית çöåø äâìéìéú E7F6E5F820E4E2ECE9ECE9FA
14 טבריה èáøéä E8E1F8E9E4
15 יהוד éäåã E9E4E5E3
16 ירושלים éøåùìéí E9F8E5F9ECE9ED
17 כפר סבא ëôø ñáà EBF4F820F1E1E0
18 לא קיים ìà œééí ECE020F7E9E9ED
19 מגדל העמק îâãì äòîœ EEE2E3EC20E4F2EEF7
20 מודיעין îåãéòéï EEE5E3E9F2E9EF
21 מעלה אדומים îòìä àãåîéí EEF2ECE420E0E3E5EEE9ED
22 נהריה Ðäøéä F0E4F8E9E4
23 נתיבות Ðúéáåú F0FAE9E1E5FA
24 נתניה ÐúÐéä F0FAF0E9E4
25 עפולה òôåìä F2F4E5ECE4
26 פתח תקוה ôúç úœåä F4FAE720FAF7E5E4
27 קריות œøéåú F7F8E9E5FA
28 קרית גת œøéú âú F7F8E9FA20E2FA
29 קרית טבעון œøéú èáòåï F7F8E9FA20E8E1F2E5EF
30 קרית שמונה œøéú ùîåÐä F7F8E9FA20F9EEE5F0E4
31 ראשון לציון øàùåï ìöéåï F8E0F9E5EF20ECF6E9E5EF
32 רחובות øçåáåú F8E7E5E1E5FA
33 רמת גן øîú âï F8EEFA20E2EF
34 תל אביב יפו úì àáéá éôå FAEC20E0E1E9E120E9F4E5
你知道为什么会发生这种情况以及如何解决吗?
我确实解决了部分问题-
df2.Gibberish[0].encode('ISO-8859-1').decode('ISO-8859-8')
退货:
'אילת'
它也适用于第二排。但当我在第三排尝试时:
df2.Gibberish[2].encode('ISO-8859-1').decode('ISO-8859-8')
我得到这个错误:
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0153' in position 2: ordinal not in range(256)
我设法不接收任何错误的唯一方法是使用以下编码和解码:
df.Gibberish[index].encode('ISO-8859-15').decode('cp1255')
但译文并不完美:
0 באר שבע
1 ב׀י בר½
2 דימו׀ה
3 אילת
4 בית שמש
5 המשולש דרום
6 המשולש צפון
7 הרצליה
8 אשדוד
9 אש½לון
10 חולון
11 חדרה
12 חיפה
13 חצור הגלילית
14 ׀הריה
15 ׀ת׀יה
16 ׀תיבות
17 יהוד
18 טבריה
19 ירושלים
20 כפר סבא
21 לא ½יים
22 מודיעין
23 מגדל העמ½
24 מעלה אדומים
25 ראשון לציון
26 רחובות
27 ½ריות
28 ½רית גת
29 ½רית טבעון
30 ½רית שמו׀ה
31 רמת גן
32 עפולה
33 פתח ת½וה
34 תל אביב יפו
2条答案
按热度按时间zmeyuzjn1#
首先,我们要说明的是,不支持在
CHARACTER SET LATIN
列中存储希伯来语字符。Teradata JDBC驱动程序提供了
CLIENT_CHARSET
连接参数,因此Java应用程序可以通过省略CHARSET=
连接参数并指定CLIENT_CHARSET=cp1255
连接参数来查询数据。请注意针对
CLIENT_CHARSET
连接参数给出的警告:* 不建议在正常情况下使用。使用风险自担。如果指定了错误的Java字符集,将导致数据损坏。使用此连接参数时,Teradata无法提供任何数据保真度或质量保证。*相反,Teradata SQL Driver for Python总是使用UTF8会话字符集,并且不提供
charset=
或client_charset=
连接参数。对于Python驱动程序,您可以使用一种变通方法,即修改查询以使用
CHAR2HEXINT
和TO_BYTES
函数将CHARACTER SET LATIN
列值转换为VARBYTE
值。然后在Python脚本中对结果集中的bytes
列值使用Python.decode("cp1255")
方法,将cp 1255-将bytes
值编码为Python字符串值。Python脚本示例:
生成以下输出:
bvjveswy2#
我刚刚从Teradata文档(H5 A0 SUCD. txt文件)中提取了Map,并将其放入
OTranslate
:-)这应该与
Hebrew1255_5A0
客户端字符集的工作方式相同:将是SQL UDF的完美用例。