Вставьте специальные символы с помощью libmysql

в программном обеспечении 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++.

Также читайте:medium.com/@adamhooper/…
Lightness Races in Orbit 28.05.2019 12:18

Затем вам нужно будет предъявить свой минимальный воспроизводимый пример.

Lightness Races in Orbit 28.05.2019 14:58

Как предполагает @LightnessRacesinOrbit, поскольку проблема связана с вашим приложением на С++, вам необходимо включить воспроизводимый пример того, что вы делаете на С++. Тем не менее, психическая отладка: вы сказали, что выполняете "SET NAMES 'utf8'"после при подключении; но согласно stackoverflow.com/questions/8112153/… вам нужно звонить mysql_options после mysql_init, но до mysql_real_connect.

Paul Wheeler 28.05.2019 23:36

Дублирование (stackoverflow.com/questions/11936950/…) включает 4-байтовые коды utf8mb4; это не тот случай здесь. Итак, я снова открываюсь.

Rick James 30.05.2019 07:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
140
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

электронный острый:

  • htmlentities: é -- Избегайте этого в базах данных.
  • latin1: шестнадцатеричный E9
  • utf8: шестнадцатеричный C3A9
  • Unicode "codepoint": U+00E9 -- Избегайте этого в базах данных.

При установлении соединения вашего клиента C++ с MySQL укажите, какая кодировка символов используется в клиент. Основываясь на «Неверное строковое значение: '\ xE9ro ...», я предполагаю, что это latin1.

Отдельно вы можете объявить столбец (field) в таблице либо CHARACTER SET latin1, либо utf8, либо utf8mb4. В первом случае E9 пройдет без изменений. В остальных E9 превратят в C3E9.

Другие вопросы по теме