в программном обеспечении C++ с использованием libmysqlclient я пытаюсь вставить строку в таблицу, содержащую символы в кодировке html, такие как é. Запрос выглядит так:
INSERT INTO mytable ( field ) VALUES( 'Justificatif d\'achat numéro 1523641305' )
Вылетает с ошибкой:
Incorrect string value: '\xE9ro 15...' for column 'field' at row 1
Если я скопирую свой запрос, например, скопирую его в рабочую среду и выполню, он сработает. Но невозможно заставить его работать из моего кода.
Мой столбец находится в кодировке utf8 с сортировкой по умолчанию.
Я подключаюсь к своей БД с помощью mysql_real_connect и вызываю "SET NAMES 'utf8'"
сразу после выполнения подключения.
Первое редактирование: Я прочитал вопросы и ответы от Вставка строки в кодировке UTF-8 в таблицу mysql в кодировке UTF-8 завершается с ошибкой "Неверное строковое значение" и попытался применить предложенные решения, но у меня это не сработало. Насколько я понимаю проблему, моя проблема отличается, поскольку символ, который я пытаюсь вставить, имеет значение U+00E9 в Unicode и, следовательно, занимает всего 2 байта. Кроме того, я могу вставить его в свою БД, но не из своего кода на C++.
Затем вам нужно будет предъявить свой минимальный воспроизводимый пример.
Как предполагает @LightnessRacesinOrbit, поскольку проблема связана с вашим приложением на С++, вам необходимо включить воспроизводимый пример того, что вы делаете на С++. Тем не менее, психическая отладка: вы сказали, что выполняете "SET NAMES 'utf8'"
после при подключении; но согласно stackoverflow.com/questions/8112153/… вам нужно звонить mysql_options
после mysql_init
, но до mysql_real_connect
.
Дублирование (stackoverflow.com/questions/11936950/…) включает 4-байтовые коды utf8mb4; это не тот случай здесь. Итак, я снова открываюсь.
электронный острый:
é
-- Избегайте этого в базах данных.E9
C3A9
U+00E9
-- Избегайте этого в базах данных.При установлении соединения вашего клиента C++ с MySQL укажите, какая кодировка символов используется в клиент. Основываясь на «Неверное строковое значение: '\ xE9ro ...», я предполагаю, что это latin1.
Отдельно вы можете объявить столбец (field
) в таблице либо CHARACTER SET latin1
, либо utf8
, либо utf8mb4
. В первом случае E9
пройдет без изменений. В остальных E9 превратят в C3E9.