powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Mysql query API C
14 сообщений из 14, страница 1 из 1
Mysql query API C
    #39212811
crimeperson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В тупике.
Имеется код:

#include <string.h>
#include <mysql.h>
#include <conio.h>
#include <iostream>

using namespace std;

int main()
{
char *host = "localhost";
char *login = "root";
char* pass = "12345";
char* dbname = "test";
unsigned int port = 3306;

MYSQL *conn;

conn = mysql_init(NULL);

if (!(mysql_real_connect(conn, host, login, pass, dbname, port, NULL, 0)))
{
cout << "Error";
_getch();
exit(1);
}

mysql_query(conn, "SET NAMES utf8 COLLATE utf8_general_ci");

cout << mysql_errno(conn);
cout << mysql_error(conn);

mysql_query(conn, "INSERT INTO persons(id, family, name, patronymic) VALUES (NULL, 'ABWG', 'ABWG', 'ABWG')");

cout << mysql_errno(conn);
cout << mysql_error(conn);


mysql_close(conn);

_getch();
return 0;
}

До тех пор пока переменные запрос содержит латиницу:

автор...VALUES (NULL, 'ABWG', 'ABWG', 'ABWG')...

Функция mysql_query() выполняется успешно:





Но нужно чтобы запрос состоял из кириллицы, данные должны быть на русском языке:

автор...VALUES (NULL, 'АБВ', 'АБВ', 'АБВ')...

Здесь функция mysql_query() перестает быть успешной:





Не могу решить эту проблему уже длительное время, но она должна быть скорей решена, не знаю что делать, прошу помощи.

Запросы:

// успешно
авторINSERT INTO persons(id, family, name, patronymic) VALUES (NULL, 'ABWG', 'ABWG', 'ABWG')

// ошибка
авторINSERT INTO persons(id, family, name, patronymic) VALUES (NULL, 'АБВ', 'АБВ', 'АБВ')

Причем все это с клиентской стороны.
Используемые настройки:

Файл my.ini
автор[client]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_general_ci'
character-set-server=utf8
collation-server=utf8_general_ci

basedir = C:\\Database\\mysql
datadir = C:\\Database\\data
port = 3306
log-error = errors.err



При соединении к mysql (в клиенте):
авторmysql_query(conn, "SET NAMES utf8 COLLATE utf8_general_ci");

Здесь подробней, если эта строка присутствует и запрос содержит кириллицу возникает ошибка(запрос не выполняется):



Если строка закоментирована, несмотря на то что в запросе присутствует кириллица запрос выполняется но имеет вид:



Состояние сервера и его настроек:





Ребята прошу кто знает в чем проблема напишите, довольно много времени потратил и у меня его сейчас нет, но решить это нужно.
...
Рейтинг: 0 / 0
Mysql query API C
    #39212813
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crimeperson,

А у вас исходники программы в какой кодировке?
...
Рейтинг: 0 / 0
Mysql query API C
    #39212820
crimeperson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, Windows-1251 (через Notepad++)
...
Рейтинг: 0 / 0
Mysql query API C
    #39212823
crimeperson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создание таблицы:

авторCREATE TABLE IF NOT EXISTS `persons`
(
`id` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
`family` VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`name` VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`patronymic` VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE = InnoDB
CHARACTER SET = utf8
COLLATE = utf8_general_ci;
...
Рейтинг: 0 / 0
Mysql query API C
    #39212843
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crimepersonmiksoft, Windows-1251 (через Notepad++)Либо перекодируйте в utf-8, либо говорите MySQL, что у вас данные в кодировке 1251.
...
Рейтинг: 0 / 0
Mysql query API C
    #39212856
crimeperson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, перекодировал в UTF-8, по прежнему те же проблемы.
...
Рейтинг: 0 / 0
Mysql query API C
    #39212861
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crimepersonmiksoft, перекодировал в UTF-8, по прежнему те же проблемы.Все так же говорит "Incorrect string value"? Показывайте сообщение об ошибке полностью.
...
Рейтинг: 0 / 0
Mysql query API C
    #39212876
crimeperson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

1. На этом изображении запрос содержит кириллицу - выдает ошибку


2. Здесь тоже самое но с комментирование строки mysql_query(...


Обратите внимание Notepad++ кодировка
...
Рейтинг: 0 / 0
Mysql query API C
    #39212932
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а Win-консоль то не логично работает в UTF-8
...
Рейтинг: 0 / 0
Mysql query API C
    #39212934
crimeperson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov, не понял
...
Рейтинг: 0 / 0
Mysql query API C
    #39212938
crimeperson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crimeperson, а какую вы используете кодировку в свои приложениях на С++ под windows?
...
Рейтинг: 0 / 0
Mysql query API C
    #39212972
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinovа Win-консоль то не логично работает в UTF-8Да вроде к ней претензий нету, мусор же не выдает.

Хотя в целом - да, если выводить что-то на консоль, то надо либо перекодировать в кодировку консоли, либо консоль переключать на другую кодировку.
Поскольку мне обычно лень делать и то, и другое, то я обычно такие вещи пишу в файл :)
...
Рейтинг: 0 / 0
Mysql query API C
    #39213174
crimeperson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
перевел полностью (СУБД, клиент) на cp1251 работает. но нужна именно utf8. Разбил запрос "SET NAMES utf8" на подзапросы:

авторcharacter_set_client
character_set_results
character_set_connection

оказывается character_set_connection генерирует ошибку (все остальные запросы работают успешно).
может ли это все быть из-за того что использую libmysql.dll который поставляется вместе с mysql 5.7?
всмысле может unicode не поддерживает.
...
Рейтинг: 0 / 0
Mysql query API C
    #39221444
unutcon Mephi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crimeperson,
Разумеется, если перевести на cp1251 работать будет( надеюсь понимаете на какой ОС).
libmysql.dll прекрасно работает с UTF-8.
Проблема "кракозябр" в UTF-8 заключается в том, что (в частном случае) на русские буквы выделяется 2 байта,в то время как на знаки пунктуации,английский алфавит,цифры и т.д. 1 байт. Таким образом вы можете работать в utf8, у вас не будет проблем с "однобайтовыми" данными, но с кириллицей будут траблы.

Для работы с "Мульти"байтовыми строками в библиотеке libmysql.dll предусмотрена функция mysql_real_query(читайте доку).

Для языка С++ необходимо использовать WideCharToMultiByte и MultByteToWideChar.(Читайте доки, ищите аналоги).

Если пользователи будут взаимодействовать с БД через ваше приложение, можно в конфиге MySQL поставить игнорирование кодировки пользователя и БД будет ожидать данных уже в UTF-8. Это избавит от необходимости использоваться SET NAMES и аналогов.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Mysql query API C
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]