5

Why does the SQLite C/C++ API return unsigned char *s for text values as opposed to the more de-facto char * type?

This is somewhat related to the unsigned char question, except that the SQLite API's decision seems opposite of the conventional char * advice given for string-like values.

For example:

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
cdleary
  • 69,512
  • 53
  • 163
  • 191

2 Answers2

11

From the SQLite documentation:

(H13821) The sqlite3_column_text(S,N) interface converts the Nth column in the current row of the result set for the prepared statement S into a zero-terminated UTF-8 string and returns a pointer to that string.

UTF-8 wants byte values ranging from 0x00 to 0xFF. char can range from -0x80 to 0x7F (signed) or 0x00 to 0xFF (unsigned). Forcing unsigned allows the proper encoding of a UTF-8 string.

strager
  • 88,763
  • 26
  • 134
  • 176
9

At a wild guess I'd say that it has something to do with supporting UTF-8 encoding. Signed char values only make sense in a 7-bit ASCII environment where everything above 0x7f is open to interpretation. In UTF-8 everything between 0x00 and 0xFF can be used equally.

bugmagnet
  • 7,631
  • 8
  • 69
  • 131