2013-04-02 3 views
0

Мне нужно создать таблицу в другой базе данных на основе выбора типов результатов. Результаты запроса могут отображаться в фактических столбцах таблицы или нет. F.e. Select 1, c from char_length_test.mysql_fetch_fields возвращает разную длину, а затем ожидается

Как получить фактический размер столбца после оператора select с помощью mysql C api?

Я создал такую ​​таблицу:

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 
} 
+0

Возможно, используется сортировка. Длина - это количество байтов, поэтому, если сортировка используется с 3 байтами на символ, она утроит объявленную длину строки. По умолчанию mysql использует UTF-8, который составляет 3 байта на символ. – Kickstart

+0

Возможно, вы имеете в виду кодировку? Сортировка предназначена для сортировки. Я попытался установить значение по умолчанию для символа ascii в конце инструкции create, результаты совпадают. Может ли быть так, что mysql использует переменные соединения для определения этого? – aisbaa

+0

Да, извините. Charset. Ascii должен быть одним байтом на символ (плюс любые байты длины и т. Д.). Дважды проверьте, что вы не устанавливаете сопоставление, хотя это приведет к тому, что mysql переместит кодировку по умолчанию для этого столбца – Kickstart

ответ

1

mysql_fetch_fields() и mysql_field_len() возвращает количество байт, необходимых для хранения значения VARCHAR, а не количество символов. Для столбцов UTF-8 это вернет в 3 раза больше фактического размера столбца, даже если в документации указано иное. Это так, что ваш C-код будет знать, сколько памяти выделяется. Если вы установили соединение MySQL (а не структуру таблицы!) С другим набором символов, вы получите разные результаты.

Edit:

Вы можете изменить набор символов соединения MySQL по телефону mysql_set_character_set(). Если вы используете набор символов 8 бит, вы должны получить количество байтов, которое соответствует ширине столбца базы данных, например:

mysql_set_character_set(&mysql,'latin1'); 
+0

Ницца, спасибо. Хотя мне все еще нужен фактический размер столбца, можно ли получить это с помощью C api? Или размер символа на основе набора символов? – aisbaa

+0

@aisbaa См. Мой отредактированный ответ – Hazzit

+0

спасибо за указание, я думаю, что я просто разделилю на 3, так как в документации MySQL также указано, что http://dev.mysql.com/doc/refman/5.0/en/charset- unicode-utf8.html – aisbaa

Смежные вопросы