在之前一個關于使用CStrings在SQL擴展中創建表資料的問題中,對于期望使用VARCHAR的表列,使用CStringGetDatum()制作的資料是一個問題。解決方案是使用CStringGetTextDatum()。現在我很好奇為什么。
這里是函式定義,但我不確定,在哪種情況下使用 CStringGetDatum() 而不是第二個,如果你不能使用第一個 CStrings:
。 #define CStringGetDatum(X) PointerGetDatum(X)
#define CStringGetTextDatum(s) PointerGetDatum(cstring_to_text(s))
#define PointerGetDatum(X) ((Datum) (X))
文本 *
cstring_to_text(const char *s)
{
return cstring_to_text_with_len(s, strlen(s)) 。
}
text *
cstring_to_text_with_len(const char *s, int len) /span>
{
text *result = (text *) palloc(len VARHDRSZ)。
SET_VARSIZE(result, len VARHDRSZ)。
memcpy(VARDATA(result), s, len) 。
return result。
}
uj5u.com熱心網友回復:
資料型別text或varchar是不是存盤為零端字符陣列的。它是一個varlena,它的長度(和其他東西)存盤在開頭。
資料型別cstring是用于C字串,是PostgreSQL的內部資料型別。你永遠不能在SQL中使用它。
當您需要傳遞一個C字串的Datum時,請使用CStringGetDatum,并使用CStringGetTextDatum將C字串轉換成text或varchar,您需要將其作為一個Datum傳遞。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/307984.html
標籤:
