Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.02.2024, 12:14
Aibekkoke Aibekkoke вне форума
Прохожий
 
Регистрация: 18.12.2009
Адрес: Казахстан, Шалкар
Сообщения: 12
Репутация: 10
По умолчанию Проблема с кодировками

Здравствуйте. Помогите пожалуйста очень прощу.
При добавлений записи в таблицу вместо казахских букв отображается вопросительный знак. Таблица в Mysql. Подключаюсь к базе через fdconnection. Запись добавляю через fdquery.
Вот такой код использую для добавление записи:
Код:
if Assigned(GlavFrm) then
    begin
      GlavFrm.FDQuery1.SQL.Text := 'INSERT INTO Malimet (tabel, name, birthday, citizenship, nationality, gender, military_rank, photo, password) VALUES (:tabel, :name, :birthday, :citizenship, :nationality, :gender, :military_rank, :photo, :password)';
      GlavFrm.FDQuery1.ParamByName('tabel').AsString := Edit1.Text;
      GlavFrm.FDQuery1.ParamByName('name').AsString := UTF8Encode(Edit2.Text);
      GlavFrm.FDQuery1.ParamByName('birthday').Value := DateTimePicker1.Date;
      GlavFrm.FDQuery1.ParamByName('citizenship').AsString := ComboBox1.Text;
      GlavFrm.FDQuery1.ParamByName('nationality').AsString := ComboBox2.Text;
      GlavFrm.FDQuery1.ParamByName('gender').AsString := ComboBox3.Text;
      GlavFrm.FDQuery1.ParamByName('military_rank').AsString := ComboBox4.Text;
      GlavFrm.FDQuery1.ParamByName('photo').AsString := label8.Caption;
      GlavFrm.FDQuery1.ParamByName('password').AsString := Edit3.Text;
      GlavFrm.FDQuery1.ExecSQL;
    end;
При созданий формы установливаю кодировку:
Код:
GlavFrm.FDQuery1.SQL.Clear;
  // Выполняем запрос для выборки данных
        GlavFrm.FDConnection1.Connected := True; // Подключаемся к базе данных
        GlavFrm.FDConnection1.Params.Values['CharacterSet'] := 'utf8';
        GlavFrm.FDQuery1.SQL.Text := 'SELECT * FROM malimet';
        GlavFrm.FDQuery1.Open;
Изображения
Тип файла: jpg Screenshot_2.jpg (76.1 Кбайт, 3 просмотров)
Ответить с цитированием
  #2  
Старый 06.02.2024, 06:48
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,055
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А если каким-нить сторонним тулом глянуть в БД? Там правильно отображается или тоже кракозябры? Очень уж похоже, что проблема на стороне базы данных, там надо задать дефолтную кодировку для полей при создании полей.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Aibekkoke (09.02.2024)
  #3  
Старый 08.02.2024, 05:36
Aibekkoke Aibekkoke вне форума
Прохожий
 
Регистрация: 18.12.2009
Адрес: Казахстан, Шалкар
Сообщения: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
А если каким-нить сторонним тулом глянуть в БД? Там правильно отображается или тоже кракозябры? Очень уж похоже, что проблема на стороне базы данных, там надо задать дефолтную кодировку для полей при создании полей.
Здравствуйте. Создавал уде 4 раза, но все равно такая проблема. Но есть один проект который делал для примера, там все отлично работает. А если подключится к этой базе который работает и добавить запись тоже такая проблема. Проблема кажется со стороны делфи:-( А если добавить запись из phpmyadmin тогда все отлично работает, нет никаких вопросительных знаков
Ответить с цитированием
  #4  
Старый 08.02.2024, 06:38
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,055
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А если конвертнуть в AnsiString с нужной кодировкой? Убери установку utf-8 и при встаке конвертируй строки в нужную кодировку. Может поможет...
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Aibekkoke (09.02.2024)
  #5  
Старый 08.02.2024, 10:21
Aibekkoke Aibekkoke вне форума
Прохожий
 
Регистрация: 18.12.2009
Адрес: Казахстан, Шалкар
Сообщения: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
А если конвертнуть в AnsiString с нужной кодировкой? Убери установку utf-8 и при встаке конвертируй строки в нужную кодировку. Может поможет...
А как это сделать, не подскажете?
Ответить с цитированием
  #6  
Старый 09.02.2024, 07:31
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,055
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Кстати, а какая кодовая страница стоит по умолчанию?
Посмотри значение в System.DefaultSystemCodePage
Если неправильная, то вызови метод System.SetMultiByteConversionCodePage для установки правильной кодировки.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Aibekkoke (09.02.2024)
  #7  
Старый 09.02.2024, 11:14
Aibekkoke Aibekkoke вне форума
Прохожий
 
Регистрация: 18.12.2009
Адрес: Казахстан, Шалкар
Сообщения: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Кстати, а какая кодовая страница стоит по умолчанию?
Посмотри значение в System.DefaultSystemCodePage
Если неправильная, то вызови метод System.SetMultiByteConversionCodePage для установки правильной кодировки.

ShowMessage('Текущая кодовая страница: ' + IntToStr(System.DefaultSystemCodePage)); показывает 1251


System.SetMultiByteConversionCodePage(65001); Потом пробовал установить utf-8, тогда вместо букв какие кракозябры появилось.

И еще если записать данные из dbgrid тогда все буквы нормально отображается. А если добавить из edit-ов и combobox-ов тогда вместо казахских букв вопросительный знак. Не знаю что делать теперь:-(
Ответить с цитированием
  #8  
Старый 09.02.2024, 19:17
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,055
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, 1251 - это русская кодировка.
Я не знаю, для казахских букв существует отдельная кодировка или они должны быть частью русской. Еще 2 момента. Я бы проверил кодировку для не-юникодных программ в Windows (это настройка). Потом посмотри (попробуй) в TEdit в св-ве Font поставить нужный чрасет, может там собака порылась...
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Aibekkoke (09.02.2024)
  #9  
Старый 09.02.2024, 19:33
Aibekkoke Aibekkoke вне форума
Прохожий
 
Регистрация: 18.12.2009
Адрес: Казахстан, Шалкар
Сообщения: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Ну, 1251 - это русская кодировка.
Я не знаю, для казахских букв существует отдельная кодировка или они должны быть частью русской. Еще 2 момента. Я бы проверил кодировку для не-юникодных программ в Windows (это настройка). Потом посмотри (попробуй) в TEdit в св-ве Font поставить нужный чрасет, может там собака порылась...
Для казахских букв использую utf8. И когда я пишу в делфи например в коментариях кода казахскую букву делфи сам установливает кодировку.
А если использовать базу данных acsess тогда все отлично добавляется. Не знаю уже что делать. Сколько дней сижу
Ответить с цитированием
  #10  
Старый 09.02.2024, 21:11
Aibekkoke Aibekkoke вне форума
Прохожий
 
Регистрация: 18.12.2009
Адрес: Казахстан, Шалкар
Сообщения: 12
Репутация: 10
По умолчанию

Теперь работает:
Form3.FDQuery1.ParamByName('tabel').DataType := ftWideString;
Form3.FDQuery1.ParamByName('tabel').AsString := WideString(Edit1.Text);
Ответить с цитированием
  #11  
Старый 09.02.2024, 23:45
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,055
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ага, как и предполагалось, где-то идет конвертация в AnsiString с неправильной кодовой страницей. Только вот я не ожидал, что она в параметрах происходит.

Кстати, переводить Edit1.Text в WideString, наверное, не обязательно.
Дефолтный String, который на самом деле UnicodeString полностью совместим с WideString (собственно, это один и тот же тип).

Т.о. можно сделать что-то типа:
Код:
      GlavFrm.FDQuery1.SQL.Text := 'INSERT INTO Malimet (tabel, name, birthday, citizenship, nationality, gender, military_rank, photo, password) VALUES (:tabel, :name, :birthday, :citizenship, :nationality, :gender, :military_rank, :photo, :password)';

      For I := 0 To GlavFrm.FDQuery1.Params.Count-1 Do
        If GlavFrm.FDQuery1.Params[i].DataType = ftString Then
          GlavFrm.FDQuery1.Params[i].DataType := ftWideString;

      GlavFrm.FDQuery1.ParamByName('tabel').AsString := Edit1.Text;
      GlavFrm.FDQuery1.ParamByName('name').AsString := UTF8Encode(Edit2.Text);
      GlavFrm.FDQuery1.ParamByName('birthday').Value := DateTimePicker1.Date;
      GlavFrm.FDQuery1.ParamByName('citizenship').AsString := ComboBox1.Text;
      GlavFrm.FDQuery1.ParamByName('nationality').AsString := ComboBox2.Text;
      GlavFrm.FDQuery1.ParamByName('gender').AsString := ComboBox3.Text;
      GlavFrm.FDQuery1.ParamByName('military_rank').AsString := ComboBox4.Text;
      GlavFrm.FDQuery1.ParamByName('photo').AsString := label8.Caption;
      GlavFrm.FDQuery1.ParamByName('password').AsString := Edit3.Text;
      GlavFrm.FDQuery1.ExecSQL;
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Aibekkoke (09.02.2024)
  #12  
Старый 21.02.2024, 19:50
AlexBrod AlexBrod вне форума
Прохожий
 
Регистрация: 21.02.2024
Сообщения: 1
Версия Delphi: Delphi 14
Репутация: 10
По умолчанию

Кстати, а какая кодовая страница стоит по умолчанию?
Посмотри значение в System.DefaultSystemCodePage
Если неправильная, то вызови метод System.SetMultiByteConversionCodePage для установки правильной кодировки.

Последний раз редактировалось Aristarh Dark, 04.03.2024 в 15:57.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:25.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter