2016-09-12 1 views
1

Я использую libmysqlclient, чтобы написать программу на C, чтобы вставить данные (удивительно) в базу данных. Набор символов из таблицы , что код вставляет и это сверка являются:Настройка collation_connection с использованием libmysqlclient C API

CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci 

В моей программе C я использовал mysql_set_character_set() для изменения набора символов; проблема в том, что эта функция меняет набор символов, а не сортировку. Если я запрашиваю набор символов и порядок сопоставления с использованием mysql_get_character_set_info результат:

char-set=utf8mb4, collation=utf8mb4_general_ci 

По MySQL documentation:

SET NAMES указывает, какой набор символов клиент будет использовать для отправки заявления SQL на сервер. Таким образом, SET NAMES 'cp1251' сообщает серверу, что «будущие входящие сообщения от этого клиента находятся в наборе символов cp1251». Он также указывает набор символов, который сервер должен использовать для отправки результатов обратно клиенту.

Так что я решил изменить соединение сверки с помощью mysql_options и MYSQL_INIT_COMMAND:

SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'; 

Вызова результирующей функции выглядит следующим образом (я назвал это раньше mysql_real_connect()):

if(mysql_options(conn, MYSQL_INIT_COMMAND, 
     "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';")) { 
    // log the errors and do proper actions 
} 

Но, кажется, что эти команды не могут изменять набор символов и сортировку! Потому что теперь, если я запрашиваю набор символов, используя mysql_get_character_set_info() результат:

char-set=latin1, collation=latin1_swedish_ci 

Самое интересное здесь в том, что на стороне MySQL, если я включаю журналы и выполнить программу MYSQL_INIT_COMMAND команды выполняют! Но mysql_get_character_set_info() не показывает это! Опять же, согласно документации libmysql по:

Int mysql_set_character_set (MYSQL * MySQL, Const символ * csname)

Эта функция используется для установки набор символов по умолчанию для текущего соединения. Строка csname указывает допустимое имя набора символов. Сопоставление соединений становится значением по умолчанию для набора символов . Эта функция работает как заявление SET NAMES, но также устанавливает значение mysql-> кодировок, и, таким образом, влияет на набор символов, используемый mysql_real_escape_string()

Я хочу изменить набор символов и порядок сопоставления в способ, которым влияет mysql_real_escape_string(). Каков правильный способ сделать это?

ответ

0

Команда init не выполнена пользователем root. (Более конкретно, любым пользователем SUPER.) Рекомендовать создать другого пользователя для вашего приложения.

Не забывайте, что ваши столбцы таблицы также должны быть объявлены CHARACTER SET utf8mb4.

+0

Ну, это не выполняется корнем или любым другим суперпользователем, но как это может повлиять на результат функции mysql_get_character_set_info()? Как я могу установить набор символов и сортировку таким образом, чтобы повлиять на mysql_real_escape_string()? – gst

+0

Так же я сделал то, что вы сказали, но все то же самое! – gst

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