0

我需要根据选择的结果类型在其他数据库中创建表。查询结果可以映射到表中的实际列,也可以不映射到 fe Select 1, c from char_length_test

如何在使用 mysql C api 的 select 语句后获取实际列大小?

我创建了这样的表:

CREATE TABLE char_length_test (c char(22))

mysql_real_query用于执行此查询

SELECT c from char_length_test

之后,我执行mysql_fetch_fields以获取c字段长度并期望它为 22,就像在 create table 语句中一样。不幸的是,长度包含 66 的值(比我预期的多 3 倍)。尝试了不同的尺寸,但结果是一样的,长度总是大 3 倍。

还使用 gdb 查看是否有任何其他包含预期值的数据字段:

{
name             = "c",
org_name         = "c",
table            = "char_length_test",
org_table        = "char_length_test",
db               = "database",
catalog          = "def",
def              = 0x0,
length           = 66,
max_length       = 0,
name_length      = 1,
org_name_length  = 1,
table_length     = 16,
org_table_length = 16,
db_length        = 6,
catalog_length   = 3,
def_length       = 0,
flags            = 0,
decimals         = 0,
charsetnr        = 33,
type             = MYSQL_TYPE_STRING,
extension        = 0x0
}
4

1 回答 1

1

mysql_fetch_fields() 和 mysql_field_len() 将返回存储 VARCHAR 值所需的字节数,而不是字符数。对于 UTF-8 列,这将返回实际列大小的 3 倍,即使文档另有说明。这是为了让您的 C 代码知道要分配多少内存。如果您将 MySQL 连接(而不是表结构!)设置为不同的字符集,您将得到不同的结果。

编辑:

您可以通过调用mysql_set_character_set()来更改 MySQL 连接的字符集。如果您使用 8 位字符集,您应该获得与数据库列的宽度匹配的字节数,例如:

mysql_set_character_set(&mysql,'latin1');
于 2013-04-02T14:36:36.000 回答