如何将字节串插入SAP HANA

时间:2017-07-26 22:27:05

标签: sql sap hana bytestring hana-studio

我试图将两个字节串插入带有VARBINARY列的SAP HANA表中,但我一直收到语法错误。

我的两个字节串看起来像:

STRING1 = b'G\xa2ac\xa0av\xf6'  
type(STRING1) == <class 'bytes'>
STRING2 = b'708ca7fbb701799bb387f2e50deaca402e8502abe229f705693d2d4f350e1ad6' 
type(STRING2) == <class 'bytes'>

我插入值的查询如下所示:

INSERT INTO testTable VALUES(
CAST(b'708ca7fbb701799bb387f2e50deaca402e8502abe229f705693d2d4f350e1ad6' AS VARBINARY),
CAST(b'G\xa2ac\xa0av\xf6' AS VARBINARY));

我还尝试查询documentation建议的方式:

INSERT INTO testTable VALUES(
CAST(x'708ca7fbb701799bb387f2e50deaca402e8502abe229f705693d2d4f350e1ad6' AS VARBINARY),
CAST(x'G\xa2ac\xa0av\xf6' AS VARBINARY));

以及:

INSERT INTO testTable VALUES(
b'708ca7fbb701799bb387f2e50deaca402e8502abe229f705693d2d4f350e1ad6',
b'G\xa2ac\xa0av\xf6');

但所有这些都给我一些语法错误。任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

此处的问题在于您的c = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]值(STRING1)。 它不是可以表示SAP HANA中的二进制值的有效十六进制字符串。这就是为什么任何类型的铸造都会失败的原因。 相反,它似乎实际上是一个字符串,一些字符表示十六进制值(UNICODE代码点可能?)。
至少我对字符串中的b'G\xa2ac\xa0av\xf6' escpace序列做了什么。

所以,你现在可以做不同的事情。

  1. 您可以按字母顺序存储字符串中的转义序列 \x列。为此,您可以使用 插入语句中的VARBINARY
  2. 您可以将此字符串转换为应用程序代码中的有效UNICODE字符串,并将数据存储在to_binary('G\xa2ac\xa0av\xf6')列中。

答案 1 :(得分:0)

据我所知,HANA不像python那样理解字节编码,所以我认为如果在sql控制台中使用该表示,则会出现混乱。所以在python中打印b'G \ xa2ac \ xa0av \ xf6'时,ascii中不可显示的字节(你的本地编码?)的前缀是\ x。

如果你想这样做,你可能首先要将它转换为python中的十六进制表示

>>> import binascii
>>> binascii.hexlify(b'\xa2ac\xa0av\xf6')
b'47a26163a06176f6'

这将为您提供十六进制的bytearray的统一表示,您现在可以在SQL控制台中使用它(如HANA Studio等):

INSERT INTO TestTable VALUES(x'47a26163a06176f6');
-- OR
INSERT INTO TestTable VALUES(HEXTOBIN('47a26163a06176f6'));

请注意,前缀 b 会在第一种情况下更改为 x ,以表明HANA应将其视为十六进制表示形式的二进制数据。

将Python 2中的值作为预准备语句插入:

>>> cursor.execute("INSERT INTO TestTable Values(?)", \
        parameters=[binascii.hexlify(b'G\xa2ac\xa0av\xf6')])

PyHDB似乎期望一个字符串能够正确处理,但是在Python 3中hexlify将产生一个字节数组,因此你需要将结果再次转换为字符串

>>> param = str(binascii.hexlify(b'G\xa2ac\xa0av\xf6'), 'ascii')
>>> cursor.execute("INSERT INTO TestTable Values(?)", parameters=[param])

我想这可能被认为是PyHDB中的一个错误,或者至少是一个不一致的错误。为了完整起见,在SAP的dbapi客户端中有一个Binary类来为此目的包装bytearrays。

现在使用您的客户

查询
>>> import pyhdb
>>> con = pyhdb.connect(....)
>>> cursor = con.cursor()
>>> cursor.execute('SELECT * FROM TestTable')
>>> cursor.fetchall()
[(b'G\xa2ac\xa0av\xf6',)]

总结一下: b'G \ xa2ac \ xa0av \ xf6'不是HANA在SQL语句中使用它时所理解的表示形式。我们需要找到一个共同点,因为我们将bytearray转换为十六进制表示(hexlify)并告诉HANA将其处理为(x-prefix / HEXTOBIN)。

Lars Br。提到,如果那些确实是unicode文字你可能 想要将NVARCHAR视为数据类型。