Проблема с русскими символами (MySQL 5.0.51a+Lazarus 0.9.4)

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

nefarious
незнакомец
Сообщения: 7
Зарегистрирован: 30.10.2007 10:47:30

Проблема с русскими символами (MySQL 5.0.51a+Lazarus 0.9.4)

Сообщение nefarious »

Люди добрые, помогите! Я уже в отчаинье! Перерыл уже пол инэта но немогу заставить в лазаре отображать и обрабатывать русскии символы полученные из SQL запросов. Lazarus версии 0.9.4, установлен MySQL 5.0.51a, пишу из под винды, в базе кодировка cp1251, то есть данны вбиты в этой кодировки и значение переменных character_set_client=cp1251
character_set_connection=cp1251
character_set_database=cp1251
character_set_results=cp1251
character_set_server=cp1251
в lazarus использую для соединения с базой компоненты TMySQL50Connection, TSQLQuery, TSQLTransaction, пытался передовать SQL запросом после подключения параметр "SET NAMES cp1251", "SET character_set_client="cp1251", character_set_connection="cp1251", character_set_results="cp1251"" и подобные найденые в http://freepascal.ru/forum/viewtopic.ph ... sql+cp1251 и др. местах но в ответ получал ошибку, пытался менять параметры CharSet и Params - тоже безрезультатно. Может кто знает как с этим бороться или хотя бы где найти справочную информацию по эти трем компонентам лазаря?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Я делаю всё то же самое, что и Вы и у меня это работает самым восхитительным образом.
Напишите текст выдаваемой ошибки и в каком месте она возникает, иначе помочь Вам будет совершенно невозможно.
nefarious
незнакомец
Сообщения: 7
Зарегистрирован: 30.10.2007 10:47:30

Сообщение nefarious »

Если пытаюсь передавать через SQLQuery то получаю "cannot open a non-select statement"
передаю примерно таким образом:
SQLQuery.SQL.Text:="SET NAMES cp1251";
SQLQuery.Open;
Вот тут и возникает данная ошибка. За место "SET NAMES cp1251" пробывал различные значения, хотя это работает в коммандной строке самого MySQL. Пытался присваивать значение типа следующего: "UPDATE table SET NAMES cp1251", где "table" - имя таблицы к которой я подключаюсь, но результат всегда один и тот же. Так же пробывал с различными значениями для параметров ParseSQL и ReadOnly. Присваивание в редакторе форм каких бы то небыло значений параметрам CharSet и Params компоненту TMySQL50Connection не превили ни к каким видимым результам, такое ощущение что они просто игнорируются.
Не моглибы вы привести небольшой пример как правильно передовать параметры кодовой таблицы в TMySQL50Connection?
Аватара пользователя
Attid
долгожитель
Сообщения: 2589
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

:shock: а нафига ?

Код: Выделить всё

SQLQuery.SQL.Text:="select * from employee";
SQLQuery.Open;

и все
Аватара пользователя
Attid
долгожитель
Сообщения: 2589
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

да и кто работает с мускл сделайте пример с одной кнопкой и гридом для покалений, а то ежемесячно кто-нибуть приходит и глупости спрашивает.
nefarious
незнакомец
Сообщения: 7
Зарегистрирован: 30.10.2007 10:47:30

Сообщение nefarious »

Attid писал(а)::shock: а нафига ?

Код: Выделить всё

SQLQuery.SQL.Text:="select * from employee";
SQLQuery.Open;

и все

я так же считал, но когда понадобилось подобным образом вывести таблицу с русскими символами, то все они были заменены символами вопроса, вот уже четвертый день немогу это победить. Если пытаюсь вводить в таблицу русские значения то в ответ на SQLQuery.ApplyUpdates; получаю ошибку о невозможности конвертировать строку и введенная строка представлена в шенадцатиричных кодах соответствующих cp1251
nefarious
незнакомец
Сообщения: 7
Зарегистрирован: 30.10.2007 10:47:30

Сообщение nefarious »

Attid писал(а):да и кто работает с мускл сделайте пример с одной кнопкой и гридом для покалений, а то ежемесячно кто-нибуть приходит и глупости спрашивает.


вот тут находится отличный пример работы с MySQL, но про кодовые таблицы не сказано ни слова :(
nefarious
незнакомец
Сообщения: 7
Зарегистрирован: 30.10.2007 10:47:30

Сообщение nefarious »

nefarious
незнакомец
Сообщения: 7
Зарегистрирован: 30.10.2007 10:47:30

Сообщение nefarious »

Частично ответил сам на свои вопросы: В лазаре используется кодировка utf8 и если создать базу в этой кодовой таблице то русские символы обрабатываются без ошибок и отлично выводятся, но мне необходимо подключатся к базе в кодировке cp1251 :(
попытка повторить все предыдущие действия с корректировкой на данное обстоятельство так же не превили к положительным результатам.
Нашел вроде неплохое описание всех этих компонентов для работы с базами но на немецком языке в формате pdf, скачать можно отсюда:
http://mirror.optus.net/sourceforge/l/la/lazsnippets/
но подчерпнуть от туда что либо путевое у меня не получилось, сказался языковый барьер, найти чо либо подобное хотя бы на английском, не говоря уже про русский, мне не тоже удалось :(
Может у кого хотя бы какие то идеи есть что еще попробывать?
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

И когда люди будут пользоваться поиском?
http://freepascal.ru/forum/viewtopic.php?t=2368
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

nefarious писал(а):SQLQuery.SQL.Text:="SET NAMES cp1251";
SQLQuery.Open;

Может SQLQuery.Exec;
AMD
постоялец
Сообщения: 189
Зарегистрирован: 23.01.2008 21:25:25
Откуда: Кишинев

Сообщение AMD »

shade писал(а):И когда люди будут пользоваться поиском?
http://freepascal.ru/forum/viewtopic.php?t=2368


Ты не напрегайся вопросами - легче спросить чем поискать
- да и за чем форум, чтобы спросить
- а лень ответить кинь ссылку

форум в переводе это базар(рынок) - вот как в старине приходили люди на рынке болтали обменивались мнениями - повторялись вопросы ну и что - такова жизнь
nefarious
незнакомец
Сообщения: 7
Зарегистрирован: 30.10.2007 10:47:30

Сообщение nefarious »

shade писал(а):
nefarious писал(а):SQLQuery.SQL.Text:="SET NAMES cp1251";
SQLQuery.Open;

Может SQLQuery.Exec;


Спасибо, все заработало, вот код, может кому еще пригодится:
// SQLQuery.SQL.Text:='SET character_set_client="cp1251", character_set_connection="cp1251", character_set_results="cp1251"';
SQLQuery.SQL.Text:='SET NAMES cp1251';
SQLQuery.ExecSQL;
SQLQuery.SQL.Text := CommandEdit.Text;
SQLQuery.ParseSQL:=not cbReadOnly.Checked;
SQLQuery.ReadOnly:=cbReadOnly.Checked;
SQLQuery.Open;

работает как с той строкой что закоментирована, так и с "SET NAMES cp1251"
А по ссылке, что вы мне приводили, я уже был и давал ее же в самом начале, вот только как воспользоваться этими данными немог догнать четыре дня, пытаясь постоянно выполнить Open :)
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

nefarious писал(а):Спасибо, все заработало, вот код, может кому еще пригодится:

Добавим в FAQ ;)

nefarious писал(а):А по ссылке, что вы мне приводили, я уже был и давал ее же в самом начале, вот только как воспользоваться этими данными немог догнать четыре дня, пытаясь постоянно выполнить Open

Тоже бывает, я поторопился :)
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

nefarious
У Вас типичная и широкораспрстранённая ошибка.
В FAQ следует добавить не это конкретное, а вот что:
Если запрс должен возвратить набор данны, например "SELECT поле1, поле2 FROM таблица", "SHOW ..." то его выполнение нужно делать с помощью метода Open.
Если запрос не возвращает набор данных, например "UPDATE ...", "INSERER ...", "SET ..." и т.п., то его выполнение нужно делать с помощью метода ExecSQL.

Поверьте, к русским буквам это не имеет никакого отношения... :)
Ответить