gpt4 book ai didi

c - PostgreSQL 数据库在 linux 平台上使用 bytea 列将可打印字符转换为八位字节

转载 作者:太空宇宙 更新时间:2023-11-04 12:39:46 24 4
gpt4 key购买 nike

场景如下:

CREATE TABLE amaaa
(
laaaid integer NOT NULL DEFAULT 0,
blobdata bytea
)
INSERT INTO amaaa(laaaid)VALUES (1);
SQLRETURN connect()
{
SQLRETURN ret; /* ODBC API return status */

/* Allocate an environment handle */
ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &myestenv);

/* We want ODBC 3 support */
if (!ret) ret = SQLSetEnvAttr(myestenv, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);

/* Allocate a connection handle */
if (!ret) ret = SQLAllocHandle(SQL_HANDLE_DBC, myestenv, &dbc);

SQLSetConnectOption(dbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_ON);
const char* connectStr = "ByteaAsLongVarBinary=1;LFConversion=0;DSN=AMPG961;UID=postgres;PWD={postgres}";
if (!ret) ret = SQLDriverConnect(dbc, NULL, (SQLCHAR*)connectStr, strlen(connectStr), NULL, 0, NULL, SQL_DRIVER_NOPROMPT);

/* Allocate a statement handle */
if (!ret) ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);

if (ret) getErr(ret);

return ret;
}

void disconnect()
{
/* Disconnect and free all the handles */
SQLRETURN ret = SQLFreeHandle(SQL_HANDLE_STMT, stmt);
ret = SQLDisconnect(dbc);
ret = SQLFreeHandle(SQL_HANDLE_DBC, dbc);
ret = SQLFreeHandle(SQL_HANDLE_ENV, myestenv);
}

const USHORT LEN = 3;
SQLRETURN update()
{
SQLRETURN ret = connect();
if (ret) return ret;

const unsigned char vLob[LEN] = "v=";
long lBlobLen = LEN - 1;
int lMainRecordId = 1;

SQLLEN cbValue = lBlobLen;

ret = SQLPrepare(stmt, (SQLCHAR*)"UPDATE \"amaaa\" set blobdata = ? where laaaid = ?;", SQL_NTS);

if (!ret) ret = SQLBindParameter(stmt, 1, SQL_PARAM_INPUT,
SQL_BINARY, SQL_LONGVARBINARY, 0,
0, (void*)vLob, lBlobLen, &cbValue);

SQLLEN cbLen = 4;

ret = SQLBindParameter(stmt, 2, SQL_PARAM_INPUT,
SQL_C_LONG, SQL_INTEGER, 0,
0, (void*)&lMainRecordId, sizeof(long), &cbLen);

if (!ret) ret = SQLExecute(stmt);
if ((ret != SQL_SUCCESS) && (ret != SQL_NEED_DATA) && (ret != SQL_SUCCESS_WITH_INFO)) {
printf("SQLExecDirect Failed\n\n");
getErr(ret);
disconnect();
}
return ret;
}

当我从数据库查询 blobdata 列时,值总是'v\075',实际上我输入的值是'v=';但是同样的代码在windows平台上没有问题。有什么想法吗?

提前致谢。

最佳答案

看起来一切都很好!

你在数据库中存储的字节是v=的ASCII值,分别是118和61,或者十六进制的0x76和0x3D,或者八进制的0166和075。

正是这两个字节存储在 bytea 列中!

明显的问题出在您用来查询数据库的工具上。
它似乎将与 ASCII 字符对应的所有字节显示为相应的字符,将所有其他字节显示为三位八进制数(前面有反斜杠)。
这就是为什么该值对您显示为 v\075 的原因。

关于c - PostgreSQL 数据库在 linux 平台上使用 bytea 列将可打印字符转换为八位字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40608536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com