Pandas read_SQL响应应该是希伯来语,但我得到的却是乱码

wlsrxk51  于 2023-01-15  发布在  其他
关注(0)|答案(2)|浏览(88)

我有一个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  תל אביב יפו
zmeyuzjn

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驱动程序,您可以使用一种变通方法,即修改查询以使用CHAR2HEXINTTO_BYTES函数将CHARACTER SET LATIN列值转换为VARBYTE值。然后在Python脚本中对结果集中的bytes列值使用Python .decode("cp1255")方法,将cp 1255-将bytes值编码为Python字符串值。
Python脚本示例:

import teradatasql
with teradatasql.connect (host="whomooz", user="guest", password="please") as con:
 with con.cursor () as cur:
  cur.execute ("create volatile table tab1 (c1 integer, c2 varchar(100) character set latin) on commit preserve rows")
  cur.execute ("insert into tab1 values ( 0, _LATIN 'E0E9ECFA'XCV)")
  cur.execute ("insert into tab1 values ( 1, _LATIN 'E0F9E3E5E3'XCV)")
  cur.execute ("insert into tab1 values ( 2, _LATIN 'E0F9F7ECE5EF'XCV)")
  cur.execute ("insert into tab1 values ( 3, _LATIN 'E1E0F820F9E1F2'XCV)")
  cur.execute ("insert into tab1 values ( 4, _LATIN 'E1E9FA20F9EEF9'XCV)")
  cur.execute ("insert into tab1 values ( 5, _LATIN 'E1F0E920E1F8F7'XCV)")
  cur.execute ("insert into tab1 values ( 6, _LATIN 'E3E9EEE5F0E4'XCV)")
  cur.execute ("insert into tab1 values ( 7, _LATIN 'E4EEF9E5ECF920E3F8E5ED'XCV)")
  cur.execute ("insert into tab1 values ( 8, _LATIN 'E4EEF9E5ECF920F6F4E5EF'XCV)")
  cur.execute ("insert into tab1 values ( 9, _LATIN 'E4F8F6ECE9E4'XCV)")
  cur.execute ("insert into tab1 values (10, _LATIN 'E7E3F8E4'XCV)")
  cur.execute ("insert into tab1 values (11, _LATIN 'E7E5ECE5EF'XCV)")
  cur.execute ("insert into tab1 values (12, _LATIN 'E7E9F4E4'XCV)")
  cur.execute ("insert into tab1 values (13, _LATIN 'E7F6E5F820E4E2ECE9ECE9FA'XCV)")
  cur.execute ("insert into tab1 values (14, _LATIN 'E8E1F8E9E4'XCV)")
  cur.execute ("insert into tab1 values (15, _LATIN 'E9E4E5E3'XCV)")
  cur.execute ("insert into tab1 values (16, _LATIN 'E9F8E5F9ECE9ED'XCV)")
  cur.execute ("insert into tab1 values (17, _LATIN 'EBF4F820F1E1E0'XCV)")
  cur.execute ("insert into tab1 values (18, _LATIN 'ECE020F7E9E9ED'XCV)")
  cur.execute ("insert into tab1 values (19, _LATIN 'EEE2E3EC20E4F2EEF7'XCV)")
  cur.execute ("insert into tab1 values (20, _LATIN 'EEE5E3E9F2E9EF'XCV)")
  cur.execute ("insert into tab1 values (21, _LATIN 'EEF2ECE420E0E3E5EEE9ED'XCV)")
  cur.execute ("insert into tab1 values (22, _LATIN 'F0E4F8E9E4'XCV)")
  cur.execute ("insert into tab1 values (23, _LATIN 'F0FAE9E1E5FA'XCV)")
  cur.execute ("insert into tab1 values (24, _LATIN 'F0FAF0E9E4'XCV)")
  cur.execute ("insert into tab1 values (25, _LATIN 'F2F4E5ECE4'XCV)")
  cur.execute ("insert into tab1 values (26, _LATIN 'F4FAE720FAF7E5E4'XCV)")
  cur.execute ("insert into tab1 values (27, _LATIN 'F7F8E9E5FA'XCV)")
  cur.execute ("insert into tab1 values (28, _LATIN 'F7F8E9FA20E2FA'XCV)")
  cur.execute ("insert into tab1 values (29, _LATIN 'F7F8E9FA20E8E1F2E5EF'XCV)")
  cur.execute ("insert into tab1 values (30, _LATIN 'F7F8E9FA20F9EEE5F0E4'XCV)")
  cur.execute ("insert into tab1 values (31, _LATIN 'F8E0F9E5EF20ECF6E9E5EF'XCV)")
  cur.execute ("insert into tab1 values (32, _LATIN 'F8E7E5E1E5FA'XCV)")
  cur.execute ("insert into tab1 values (33, _LATIN 'F8EEFA20E2EF'XCV)")
  cur.execute ("insert into tab1 values (34, _LATIN 'FAEC20E0E1E9E120E9F4E5'XCV)")
  cur.execute ("select c1, trim(to_bytes(trim(char2hexint(c2)), translate('base16' using unicode_to_latin))) from tab1 order by 1")
  [ print (row [0], row [1].decode ("cp1255")) for row in cur.fetchall () ]

生成以下输出:

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 תל אביב יפו
bvjveswy

bvjveswy2#

我刚刚从Teradata文档(H5 A0 SUCD. txt文件)中提取了Map,并将其放入OTranslate:-)
这应该与Hebrew1255_5A0客户端字符集的工作方式相同:

OTranslate
 (  -- convert to "gibberish" unicode
   Translate(hewbrew USING latin_to_unicode) 
    -- H5A0SUCD.txt: characters >= x80
  ,_latin '8082838485868788898B9192939495969798999BA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CBCCCDCECFD0D1D2D3D4D5D6D7D8E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFDFE'XCV
    -- mapped hebrew characters >= x80
  ,_Unicode '20AC201A0192201E20262020202102C62030203920182019201C201D20222013201402DC2122203A00A000A100A200A320AA00A500A600A700A800A900D700AB00AC00AD00AE00AF00B000B100B200B300B400B500B600B700B800B900F700BB00BC00BD00BE00BF05B005B105B205B305B405B505B605B705B805B905BB05BC05BD05BE05BF05C005C105C205C305F005F105F205F305F405D005D105D205D305D405D505D605D705D805D905DA05DB05DC05DD05DE05DF05E005E105E205E305E405E505E605E705E805E905EA200E200F'xcv
 )

将是SQL UDF的完美用例。

相关问题