Я использую 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
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()
. Каков правильный способ сделать это?
Ну, это не выполняется корнем или любым другим суперпользователем, но как это может повлиять на результат функции mysql_get_character_set_info()? Как я могу установить набор символов и сортировку таким образом, чтобы повлиять на mysql_real_escape_string()? – gst
Так же я сделал то, что вы сказали, но все то же самое! – gst