Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка Incorrect string value на некоторых системах / 16 сообщений из 16, страница 1 из 1
14.06.2021, 09:25
    #40077454
M1ndAction
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка Incorrect string value на некоторых системах
Разрабатываю приложение на Delphi, которое взаимодействует с удалённым сервером MariaDB (через ADO и ODBC-драйвер). На некоторых компьютерах (судя по всему, на Windows до 10 - Vista, 7, 8) при попытке отправить параметризированный запрос (INSERT, UPDATE) с кириллицей появляется ошибка:
автор[MySQL][ODBC 8.0(w) Driver][mysqld-5.5.5-10.3.29-MariaDB]Incorrect string value: '\xC2\xC2\xC8 \xF1\xE8…' for column <здесь целевые таблица и столбец> at row 1
Столбец в utf8. При этом, если не использовать запросы вручную, а, например, редактировать данные в TDBGrid, то кириллица успешно отправляется.
По всей видимости, где-то несовпадение кодировки при использовании параметров. Но вроде бы все параметры в utf8: база данных, столбец, драйвер, Delphi XE3 с Юникодом. В SELECT всё корректно отображается.

Также важный момент: кириллица корректно отправляется, если задать DataType параметра в ftWideString. В Windows 10 при присваивании значения параметра (через Value) DataType автоматически устанавливается в ftWideString, а в старых системах - ftString, поэтому и приходится устанавливать вручную ftWideString. По всей видимости в Windows 10 драйвер видит, что строки должны быть в ftWideString, а в старых системах нет. Как это поправить?
Тип строк, которые добавляются в строковые параметры запроса - обычный string.

Подключение к базе данных:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure OpenDBConnection;
  begin
    dmMain.dbConnection.Connected := False;
    dmMain.dbConnection.ConnectionString := Format(
      'Driver={MySQL ODBC 8.0 Unicode Driver};Port=%s;Server=%s;Database=%s;User=%s;Password=%s;',
      [Port, Server, Database, User, Password]);
    dmMain.dbConnection.Connected := True;
  end;



Также прикладываю значения системных переменных character (вызов из программы).
...
Рейтинг: 0 / 0
14.06.2021, 10:15
    #40077461
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка Incorrect string value на некоторых системах
и приходится устанавливать вручную ftWideString. По какому-то событию (н-р при открытии формы) пробегать по параметрам всех датасетов и выставлять программно.
...
Рейтинг: 0 / 0
14.06.2021, 10:37
    #40077463
M1ndAction
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка Incorrect string value на некоторых системах
L_argo
и приходится устанавливать вручную ftWideString.
По какому-то событию (н-р при открытии формы) пробегать по параметрам всех датасетов и выставлять программно.
Очень уж костыльное решение :) Должно быть что-то другое. Хотя, по сути, сейчас нечто подобное и приходится использовать. Все запросы динамические, поэтому присвоили CommandText, и для каждого параметра указали DataType, присвоили Value. Но, повторюсь, думаю должно существовать какое-то более фундаментальное решение вопроса.
...
Рейтинг: 0 / 0
14.06.2021, 10:54
    #40077465
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка Incorrect string value на некоторых системах
M1ndAction,

попробуйте:

Код: pascal
1.
2.
3.
    dmMain.dbConnection.ConnectionString := Format(
      'Driver={MySQL ODBC 8.0 Unicode Driver};Port=%s;Server=%s;Database=%s;User=%s;Password=%s;charset=UTF8;',
      [Port, Server, Database, User, Password]);
...
Рейтинг: 0 / 0
14.06.2021, 11:03
    #40077467
M1ndAction
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка Incorrect string value на некоторых системах
Кроик Семён
M1ndAction,

попробуйте:

Код: pascal
1.
2.
3.
    dmMain.dbConnection.ConnectionString := Format(
      'Driver={MySQL ODBC 8.0 Unicode Driver};Port=%s;Server=%s;Database=%s;User=%s;Password=%s;charset=UTF8;',
      [Port, Server, Database, User, Password]);



Да, пробовал такой вариант - безрезультатно.
...
Рейтинг: 0 / 0
14.06.2021, 11:28
    #40077469
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка Incorrect string value на некоторых системах
M1ndAction,

а просто указание COLLATE utf8_general_ci в самих запросах не спасает?
...
Рейтинг: 0 / 0
14.06.2021, 13:19
    #40077487
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка Incorrect string value на некоторых системах
M1ndAction
Подключение к базе данных:
А где код вставки?
M1ndAction
Также прикладываю значения системных переменных character
Где?
...
Рейтинг: 0 / 0
14.06.2021, 13:35
    #40077491
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка Incorrect string value на некоторых системах
M1ndActionНо вроде бы все параметры в utf8: база данных, столбец, драйвер

Вот только тебя в сообщении об ошибке явный ANSI (Windows-1251). А вообще "уже смешно"
начинается на "через ADO и ODBC-драйвер".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.06.2021, 13:58
    #40077494
M1ndAction
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка Incorrect string value на некоторых системах
Gerasimenko
M1ndAction,

а просто указание COLLATE utf8_general_ci в самих запросах не спасает?

Не пробовал, но подобного - правки существующих запросов - хотелось бы избежать.


_Vasilisk_
M1ndAction
Подключение к базе данных:
А где код вставки?
M1ndAction
Также прикладываю значения системных переменных character
Где?

Изображение к первому сообщению не прикрепилось, так что покажу текстом:
character_set_client = utf8
character_set_connection = utf8
character_set_database = utf8
character_set_filesystem = binary
character_set_results =
character_set_server = latin1
character_set_system = utf8

А что касается кода вставка, то например так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
cmdTemp: TADOCommand;

const
  tblEquip = 'equip';
  colEquipName = 'eqname';

  queryInsertEquipment =
    ' INSERT INTO ' + tblEquip + '(' +
    colEquipName + ') ' +
    'VALUES(:' +
    colEquipName + '); ';


function TdmMain.AddEquipment(const Equip: TEquipment;
  const RefreshEquipmentListDataSet: Boolean): Integer;
begin
  Result := 0;

  try
    cmdTemp.CommandText := queryInsertEquipment;
    cmdTemp.Parameters.ParamByName(colEquipName).Value := Equip.Name;
    cmdTemp.Execute;
    Result := GetLastID;

    if RefreshEquipmentListDataSet then
      RefreshDataSet(dsetEquipment, colEquipID, Result);
  except on E: Exception do
    fmMessage.ShowMessage(msgErrorAddEquipment, mtError);
  end;
end;



Dimitry Sibiryakov

M1ndActionНо вроде бы все параметры в utf8: база данных, столбец, драйвер

Вот только тебя в сообщении об ошибке явный ANSI (Windows-1251). А вообще "уже смешно"
начинается на "через ADO и ODBC-драйвер".

Да, возможно ANSI, хотя я пробовал указывать charset=cp1251 в строке соединения, но безрезультатно. Возможно, что-то иное по настройкам нужно скорректировать?
...
Рейтинг: 0 / 0
14.06.2021, 14:13
    #40077495
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка Incorrect string value на некоторых системах
M1ndActionИзображение к первому сообщению не прикрепилось, так что покажу текстом:
character_set_client = utf8
character_set_connection = utf8
character_set_database = utf8
character_set_filesystem = binary
character_set_results =
character_set_server = latin1
character_set_system = utf8

Это именно у проблемного коннекта или (внезапно) у коннекта в котором всё работает?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.06.2021, 14:17
    #40077497
M1ndAction
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка Incorrect string value на некоторых системах
Dimitry Sibiryakov

M1ndActionИзображение к первому сообщению не прикрепилось, так что покажу текстом:
character_set_client = utf8
character_set_connection = utf8
character_set_database = utf8
character_set_filesystem = binary
character_set_results =
character_set_server = latin1
character_set_system = utf8

Это именно у проблемного коннекта или (внезапно) у коннекта в котором всё работает?


Они идентичны: и у проблемного соединения, и у рабочего выводятся одни и те же значения.
...
Рейтинг: 0 / 0
14.06.2021, 14:21
    #40077498
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка Incorrect string value на некоторых системах
M1ndActionПо всей видимости в Windows 10 драйвер видит, что строки должны быть в ftWideString, а в
старых системах нет. Как это поправить?

Для начала - найти который именно из пяти последовательно подключенных тобою драйверов это
"видит".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.06.2021, 14:31
    #40077500
M1ndAction
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка Incorrect string value на некоторых системах
Dimitry Sibiryakov

M1ndActionПо всей видимости в Windows 10 драйвер видит, что строки должны быть в ftWideString, а в
старых системах нет. Как это поправить?

Для начала - найти который именно из пяти последовательно подключенных тобою драйверов это
"видит".

Поподробнее, пожалуйста, откуда столько драйверов? Я использую только один - официальный от MySQL, который указан в строке подключения соединения.
...
Рейтинг: 0 / 0
14.06.2021, 14:38
    #40077502
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка Incorrect string value на некоторых системах
M1ndAction
Я использую только один - официальный от MySQL
А подключаетесь к MariaDB? А ничего, что это разные СУБД?

https://mariadb.com/kb/en/mariadb-connector-odbc/
...
Рейтинг: 0 / 0
14.06.2021, 14:38
    #40077503
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка Incorrect string value на некоторых системах
M1ndActionПоподробнее, пожалуйста, откуда столько драйверов?

1. VCL обёртка для ADO.
2. ADO драйвер для OLE DB.
3. OLE DB драйвер для ODBC.
4. ODBC драйвер для MySQL.
5. Собственно MySQL драйвер.

Раз список одинаков, то пятую позицию можно считать невиновной. Остаются ещё четыре.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.06.2021, 15:09
    #40077508
M1ndAction
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка Incorrect string value на некоторых системах
_Vasilisk_
M1ndAction
Я использую только один - официальный от MySQL
А подключаетесь к MariaDB? А ничего, что это разные СУБД?

https://mariadb.com/kb/en/mariadb-connector-odbc/


Но они ведь совместимы между собой. Но вы правы, также исследую этот момент.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка Incorrect string value на некоторых системах / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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