0

我正在尝试将两个字节串插入到带有 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));

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

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');

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

4

2 回答 2

0

据我所知,HANA 不像 python 那样理解字节编码,所以我认为如果您在 sql 控制台中使用该表示形式,就会出现混淆。因此,在 python 中,当打印 b'G\xa2ac\xa0av\xf6' 时,一个在 ascii 中无法呈现的字节(您的本地编码?)以 \x 为前缀。

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

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

这将为您提供十六进制字节数组的统一表示,您现在可以在 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 类可以为此目的包装字节数组。

现在向您的客户查询

>>> 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 语句中使用它时所理解的表示。我们需要找到一个共同点,因为我们将字节数组转换为十六进制表示 ( hexlify) 并告诉 HANA 以这样的方式处理它 (x-prefix / HEXTOBIN)。

作为拉斯 Br。提到,如果这些确实是 unicode 文字,您可能需要将 NVARCHAR 视为数据类型。

于 2017-08-03T23:23:28.563 回答
0

这里的问题在于你的STRING1价值(b'G\xa2ac\xa0av\xf6')。它不是可以在 SAP HANA 中表示二进制值的有效十六进制字符串。这就是为什么任何类型转换都会在这里失败的原因。相反,它似乎实际上是一个字符串,并且一些字符表示为十六进制值(可能是 UNICODE 代码点?)。
至少这就是我\x对字符串中的 escpace 序列所做的。

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

  1. 您可以将字符串与 VARBINARY列中的转义序列一起存储。为此,您可以 to_binary('G\xa2ac\xa0av\xf6')在插入语句中使用。
  2. 您可以在应用程序代码中将此字符串转换为有效的 UNICODE 字符串,并将数据存储在NVARCHAR列中。
于 2017-07-27T04:53:39.743 回答