in driver/utility.cc [1509:1601]
SQLLEN get_display_size(STMT *stmt __attribute__((unused)),MYSQL_FIELD *field)
{
int capint32 = stmt->dbc->ds.opt_COLUMN_SIZE_S32 ? 1 : 0;
unsigned int mbmaxlen = get_charset_maxlen(field->charsetnr);
switch (field->type) {
case MYSQL_TYPE_TINY:
return 3 + (field->flags & UNSIGNED_FLAG ? 1 : 0);
case MYSQL_TYPE_SHORT:
return 5 + (field->flags & UNSIGNED_FLAG ? 1 : 0);
case MYSQL_TYPE_INT24:
return 8 + (field->flags & UNSIGNED_FLAG ? 1 : 0);
case MYSQL_TYPE_LONG:
return 10 + (field->flags & UNSIGNED_FLAG ? 1 : 0);
case MYSQL_TYPE_FLOAT:
return 14;
case MYSQL_TYPE_DOUBLE:
return 24;
case MYSQL_TYPE_NULL:
return 1;
case MYSQL_TYPE_LONGLONG:
return 20;
case MYSQL_TYPE_DATE:
return 10;
case MYSQL_TYPE_TIME:
return 8;
case MYSQL_TYPE_TIMESTAMP:
case MYSQL_TYPE_DATETIME:
case MYSQL_TYPE_NEWDATE:
return 19;
case MYSQL_TYPE_YEAR:
return 4;
case MYSQL_TYPE_DECIMAL:
case MYSQL_TYPE_NEWDECIMAL:
return field->length;
case MYSQL_TYPE_BIT:
/*
We treat a BIT(n) as a SQL_BIT if n == 1, otherwise we treat it
as a SQL_BINARY, so display length is (bits + 7) / 8 * 2.
field->length has the number of bits.
*/
if (field->length == 1)
return 1;
return (field->length + 7) / 8 * 2;
case MYSQL_TYPE_TINY_BLOB:
case MYSQL_TYPE_MEDIUM_BLOB:
case MYSQL_TYPE_LONG_BLOB:
case MYSQL_TYPE_BLOB:
// For these types the storage is in bytes and it is fixed,
// not specified by the user.
// The driver must give the maximum possible display size.
mbmaxlen = 1;
// Fall through
case MYSQL_TYPE_ENUM:
case MYSQL_TYPE_SET:
case MYSQL_TYPE_VARCHAR:
case MYSQL_TYPE_VAR_STRING:
case MYSQL_TYPE_STRING:
case MYSQL_TYPE_GEOMETRY:
{
unsigned long length;
if (field->charsetnr == BINARY_CHARSET_NUMBER)
length= field->length * 2;
else
length= field->length / mbmaxlen;
if (capint32 && length > INT_MAX32)
length= INT_MAX32;
return length;
}
case MYSQL_TYPE_JSON:
return UINT_MAX32 / 4; // 4 is the character size in UTF8MB4
case MYSQL_TYPE_VECTOR:
return 15 * (field->length / 4) + 1;
}
return SQL_NO_TOTAL;
}