Имя: Пароль:
1C
1С v8
Помогите победить MySQL: Illegal mix of collations
0 Zhuravlik
 
15.07.14
11:52
Добрый день. Подключил используя внешние источники табличку MySQL, при этом если открываю основную форму списка этого источника - все нормально. Если настраиваю группировки в этой форме списка, получаю ошибку: http://hostingkartinok.com/show-image.php?id=868b67f719abed250ba8dd9e49d162cf.
Таблички MySQL создаю через ADO, примерно так:
    // Подсоединяюсь к драйверу MySQL:
    стр_Коннект_Скуль = "DRIVER=MySQL ODBC 3.51 Driver;UID=root;PWD=123;STMT=set character_set_results=cp1251;";
    адо_Соединение_Скуль = "";
    
    // Инициализация основного объекта ADODB.Connection. Открытие соединения.
    адо_Соединение_Скуль = Новый COMОбъект("ADODB.Connection");
    адо_Соединение_Скуль.ConnectionString =  стр_Коннект_Скуль;
    адо_Соединение_Скуль.Open();    

    адо_Соединение_Скуль.Execute("set names cp1251;");
    адо_Соединение_Скуль.Execute("CREATE DATABASE IF NOT EXISTS `Price` DEFAULT CHARSET=cp1251;");
    адо_Соединение_Скуль.Execute("use `Price`");
    адо_Соединение_Скуль.Execute("DROP TABLE IF EXISTS `VRN_price`;");

    // Формирую поля для запроса, согласно таблице соответстви
    стр_КолонкиИнсерта = "";
    стр_ПоляЗапроса = "";
    Для каждого стр_тз Из тзКолонки Цикл
        
        стр_КолонкиИнсерта = стр_КолонкиИнсерта + "
        |    `" +  стр_тз.ИдПоляСкуль + "`, ";
        
        стр_ПоляЗапроса = стр_ПоляЗапроса + "
        |    `" + стр_тз.ИдПоляСкуль + "`    " + стр_тз.ТипПоляСкуль + ",";        
    КонецЦикла;
    
    // Собираю строку - текст запроса для создания таблицы Price:
    стр_СозданиеТаблицыПрайс = "
    |CREATE TABLE IF NOT EXISTS `VRN_price`
    |("
    + стр_ПоляЗапроса +"    
    |    `ID` INT(15) NOT NULL AUTO_INCREMENT PRIMARY KEY
    |        ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1;";
    
    адо_Соединение_Скуль.Execute(стр_СозданиеТаблицыПрайс);    

С базой из предприятия соединяюсь так:
DRIVER={MySQL ODBC 3.51 Driver};
SERVER=127.0.0.1;
DATABASE=Price;
STMT=set character_set_results=cp1251;

Я так понимаю, у меня проблема с кодировками. Но я при создании и при подключении явно указал везде cp1251. Что ей не так?
1 Лефмихалыч
 
15.07.14
11:57
(0) проблема вот тут "character_set_results=cp1251"
у тебя база в latin1_swedish видимо, а не в cp1251
2 Zhuravlik
 
15.07.14
12:01
(0) Но если я эту строчку убираю, в форме списка одни вопросы. В смысле вместо строки "Производитель оборудования" вижу "???????????? ??????????".
А как  ее переопределить?
Плохо знаю мат. часть, не допонимаю взаимосвязи.
3 Лефмихалыч
 
15.07.14
12:04
надо перед выводом как-то конверить из latin1_swedish в то, в чем выводишь. Еще можно в исходной базе поменять на человеколюбивый коллэйшн
4 Zhuravlik
 
15.07.14
12:14
(3) "Перед выводом конвертить" - я так понимаю это в платформе зашито, может конечно глупость ляпнул, но не нашел где бы могла переопределяться кодировка в внешних источниках.  Можно чуть подробнее про "человеколюбивый коллэйшен" - я так понимаю, можно при создании таблиц задавать некую универсальную настройку, чтобы потом не мучиться с кодировками при чтении?
5 Лефмихалыч
 
15.07.14
12:25
(4) коллэйшн задается при создании базы. По умолчанию он наследуется от сервера. Сервер берет его из mysql.conf (или как так его?)
Короче, создай базу с CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE DATABASE `mydb` CHARACTER SET utf8 COLLATE utf8_general_ci;

и не парься. Тогда не надо будет в 1С character_set_results писать - кодировка будет совпадать и там, и тут
6 Лефмихалыч
 
15.07.14
12:25
при создании таблиц CHARACTER SET и COLLATE наследуются от базы. Просто создай базу с правильными настройками
7 Zhuravlik
 
15.07.14
13:28
(5) Получилось, спасибо)
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.