Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: MySQL 5.5 + Delphi XE: как настроить кодировку? [ default-character-set=cp1251 ]  (Прочитано 31952 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
malor
Опытный

ru
Offline Offline

« : 11-09-2011 07:42 » 

У меня в Delphi XE такие вещи:

Загружал в комбобокс из базы.
Если сделать в cmd-консоли SELECT-выборку, то отобразится кириллица нормально.
В SQL-Front - каракули.
 
my.ini
[mysql]
default-character-set=cp1251


Что предпринять браза?

MySQL 5.5, SQL-Front 5.1

* 1.jpg (8.37 Кб - загружено 6172 раз.)
« Последнее редактирование: 15-09-2011 07:22 от RXL » Записан
RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 11-09-2011 08:15 » 

malor, кодировку лучше всего указать для каждой таблицы отдельно при её создании: http://dev.mysql.com/doc/refman/5.0/en/charset-table.html
Записан

Любимая игрушка - debugger ...
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 11-09-2011 09:16 » 

Предлагаю такой вариант.
На сервере указываются кодировки хранения и обработки, а также возможность договориться с клиентом о кодировке клиента.

Код: (INI)
character-set-client-handshake
character-set-filesystem = utf8
character-set-server = utf8

В случае винды лучше не использовать не-ASCII в именах таблиц:

Код: (INI)
character-set-client-handshake
character-set-filesystem = latin1
character-set-server = utf8

На стороне клиента после подключения выполнить:

Код: (MySQL)
SET NAMES желаемая_кодировка

Лучше всего, если базы и таблицы будут в utf8.
« Последнее редактирование: 11-09-2011 09:18 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
malor
Опытный

ru
Offline Offline

« Ответ #3 : 14-09-2011 18:44 » 

А самый первый код (INI) вы для UNIX-ов привели?

Конфиг в текущий момент такой:
Цитата
[client]
port=3306

[mysql]
#default-character-set=cp1251
default-character-set=utf8

[mysqld]
#skip-character-set-client-handshake

port=3306
basedir="C:/MySQL55/"
datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.5/Data/"
#character-set-server=cp1251
character-set-server=utf8
character-set-client-handshake
character-set-filesystem = latin1

default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=100
query_cache_size=0
table_cache=256
tmp_table_size=18M
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=35M
key_buffer_size=25M
read_buffer_size=64K
read_rnd_buffer_size=256K
sort_buffer_size=256K


#skip-innodb
innodb_additional_mem_pool_size=2M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=47M
innodb_log_file_size=24M
innodb_thread_concurrency=8

Если написать
Код:
 SQL.Clear;
 SQL.Add('SET NAMES CP1251');
 ExecSQL;

то выйдетerror:
"SET NAMES not allowed by driver"

На stackoverflow написано:
Цитата
SET NAMES has been deactivated in the MySQL ODBC driver. If you are confident you can read the characters via direct access to the database (via mysql or one of MySQL's GUI front ends), then you could try to replicate what SET NAMES does. The following is from the MySQL manual:

A SET NAMES 'x' statement is equivalent to these three statements:
SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;

Попробовал так, но русских букв все равно нет:
Код:
procedure TForm1.LoadComboUTF8();
begin
  try
    with ADOQuery1 do
    begin
      SQL.Clear;
      //SQL.Add('SET NAMES CP1251');
      SQL.Add('SET character_set_client = utf8');
      ExecSQL;

      SQL.Clear;
      SQL.Add('SET character_set_results = utf8');
      ExecSQL;

      SQL.Clear;
      SQL.Add('SET character_set_connection = utf8');
      ExecSQL;


      SQL.Clear;
      SQL.Add('SELECT * FROM category WHERE category = 1'); 
      Active := True;
      //ShowMessage(IntToStr(RecordCount));
    end;
  except
     on e:Exception do
  end;

  AdoQuery1.First;
  while not AdoQuery1.Eof do
  begin
    s := AdoQuery1.FieldByName('item').AsString;
    i := AdoQuery1.FieldByName('category').AsInteger;
    cbComboUTF8.AddItem(s, TObject(i));

    AdoQuery1.Next;
  end;

  ADOQuery1.Close;
  cbComboUTF8.ItemIndex := 0;
end;

ConnectionString такова:
Provider=MSDASQL.1;Password="";Persist Security Info=True;User ID=root;Data Source=nodeutf8;Mode=ReadWrite;Extended Properties="DSN=nodeutf8;UID=root;PWD=;";Initial Catalog=nodeutf8;

Таблицу создавал так:
Код:
CREATE TABLE category
(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
category TINYINT UNSIGNED NOT NULL,
item VARCHAR(100) CHARACTER SET UTF8 NOT NULL
);

INSERT INTO category (category, item) VALUES
(1, 'До 12'),
(1, 'После 12');

RuNTiME, у них же есть последний пункт:
"Otherwise, the database character set and collation are used. "
Записан
RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 14-09-2011 20:03 » 

malor, Попробуй определить какую именно кодировку использует твоя программа и укажи такую же при создании таблицы. Тогда отпадет надобность перекодировки в MySQL драйвере. Судя по виду "иероглифов" данные из базы приходят в utf-8, а интерпретируются как cp1251. Еще встречались на практике случаи двойной перекодировки, например с БД приходят данные в utf-8, драйвер их интерпретирует как cp1251, а затем еще раз перекодирует в utf-8.
Записан

Любимая игрушка - debugger ...
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 15-09-2011 05:47 » 

Есть такая команда - SHOW CHARACTER SET
Нетрудно посмотреть, что "cp1251" пишется в нижнем регистре.

В конфиге секция "mysql" относится только к одноименной утилите и никак не относится к ODBC драйверу. Общая для всех клиентов секция - "client".

Добавлено через 2 минуты и 6 секунд:
malor, выполни команду

Код: (MySQL)
SHOW VARIABLES LIKE 'character\_set\_%';

и покажи результат.

Также убедись, что у тебя стоит последняя версия MySQL. Для ветки 5.5 последняя - 5.5.15.
http://www.mysql.com/downloads/mysql/

Код: (MySQL)
SELECT VERSION();
« Последнее редактирование: 15-09-2011 05:51 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
malor
Опытный

ru
Offline Offline

« Ответ #6 : 15-09-2011 06:09 » 



* 1.jpg (30.89 Кб - загружено 5751 раз.)
* 2.jpg (53.43 Кб - загружено 5975 раз.)
« Последнее редактирование: 15-09-2011 07:22 от RXL » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 15-09-2011 06:11 » 

Код: (MySQL)
SHOW VARIABLES LIKE 'character\_set\_%';

Выполни это в своем приложении, а не в консоли!
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
malor
Опытный

ru
Offline Offline

« Ответ #8 : 15-09-2011 06:30 » 


* 5b8fa8f15553.jpg (35.62 Кб - загружено 6038 раз.)
« Последнее редактирование: 15-09-2011 07:19 от RXL » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 15-09-2011 07:18 » 

Небольшая организационная просьба: не публиковать на форуме картинки с всяких радикалов, а прикреплять их к посту. Через некоторое время картинки просто пропадут и тема станет "дырявой". Также скриншоты лучше делать в формате PNG, а не JPG.

По теме: а теперь после подключения выполни SET NAMES cp1251 и проверь переменные еще раз.
« Последнее редактирование: 15-09-2011 07:21 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
malor
Опытный

ru
Offline Offline

« Ответ #10 : 15-09-2011 07:32 » 


* ComboUTF8_3.jpg (108.18 Кб - загружено 908 раз.)
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 15-09-2011 08:37 » 

Понял. ODBC не пропускает команду.
Такое предложение: попробуй добавить в connection string параметр "charset=cp1251".
http://dev.mysql.com/doc/refman/5.5/en/connector-odbc-configuration-connection-parameters.html
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
malor
Опытный

ru
Offline Offline

« Ответ #12 : 15-09-2011 09:01 » 

Добавил:
Provider=MSDASQL.1;Password="";Persist Security Info=True;User ID=root;Data Source=nodeutf8;Mode=ReadWrite;Extended Properties="DSN=nodeutf8;UID=root;PWD=;";Initial Catalog=nodeutf8;charset=cp1251

Крякозябры изменились слегка:

* CharacterSet_1.png (29.22 Кб - загружено 981 раз.)
* ComboUTF8Project.zip (85.12 Кб - загружено 837 раз.)
« Последнее редактирование: 15-09-2011 09:05 от malor » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 15-09-2011 10:08 » 

Попробуй еще кодировку "ucs2" (та самая UTF-16, что и в винде). Но может не сработать: года два назад читал, что поддержка данной кодировки ограниченная и не знаю текущего состояния.

Добавлено через 2 минуты и 50 секунд:
И мне не нравится provider в твоем connection string.
http://www.connectionstrings.com/mysql#p31
« Последнее редактирование: 15-09-2011 10:10 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
malor
Опытный

ru
Offline Offline

« Ответ #14 : 19-09-2011 08:39 » 

Попробуй еще кодировку "ucs2" (та самая UTF-16, что и в винде).

Где именно её применить?
Код:
[mysql]
default-character-set=ucs2

[mysqld]
#skip-character-set-client-handshake

port=3306
basedir="C:/MySQL55/"
datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.5/Data/"
character-set-server=ucs2
character-set-client-handshake
character-set-filesystem = latin1
?

И мне не нравится Provider в твоем connection string.
http://www.connectionstrings.com/mysql#p31
Он у них вообще не упомянут. Почему7
Вставить Driver ={MySQL ODBC 5.1 Driver} вместо Provider'а?

Несколько ссылок:
mySQL и Кодировка unicode
Проблема с кодировкой в MySQL через dbExpress, DBGrid показывает кракозябры
How to set charset for MySQL in RODBC?
Delphi 7 Personal, MySQL using libmysql.dll + UTF8
MySQL и Delphi. Проблема с русским текстом.
Чтение данных (MySQL - utf8)
Параметры и mysql-connector-odbc-5.1.5
MySQL5, Delphi7, utf8, В проге показываются каракули
ADO + MySQL кодировка
ADO и кодировка русская?
"ADODB.Connection" проблема с кодировкой
База в UTF8, коннект через ADO - получаю знаки вопроса где настроить кодировку в ADO
DBGrid+MySQL+кодировка
Кодировка  
Позволю себе процитировать:
Цитата
Проблема с ODBC "решается" созданием папки C:\mysql\ и копированием в неё папки share из каталога установленной MySQL.
Видимо C:/MySQL/ - жестко прописан в драйвере ODBC.
Там люди решали не про utf8, а про cp1251, но само упоминание привязки "ODBC" насторожило...
Пару скринов тогда уж:


* InitialStatement.png (14.85 Кб - загружено 884 раз.)
* InitialStatement_2.png (10.65 Кб - загружено 954 раз.)
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 19-09-2011 09:36 » 

Драйвер MySQL ODBC, как версии 3, так и 5 я не раз ставил и никаких дополнительных директорий создавать не приходилось.

Кодировку надо в connection string прописывать и ссылку я привел затем, что у тебя ошибка с прописыванием кодировки, которую ты в упор не видишь.

Вечером еще протестирую connection string и отпишусь.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #16 : 12-10-2011 19:33 » new

XE вся на юникоде работает, не? И база на юникоде. Там безо всяких cp1251 все показываться должно.

поскольку работа идет через ODBC, АДО-шные компоненты там нахрен не нужны. Стоит попробовать  заюзать обычные BDE-шные TQuery и на нужных полях указать Transiterate = TRUE. Если не поможет, поиграться настройками Алиаса в сам BDE Administratore, там можно устанавливать LangDriver напрямую, а не через команды ODBC-драйверу, которые могут и не прокатить.
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines