我需要根据选择的结果类型在其他数据库中创建表。查询结果可以映射到表中的实际列或不映射到f.e. 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。不幸的是,长度包含值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
}
答案 0 :(得分: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');