Имя: Пароль:
1C
1С v8
Внешний источник данных MySQL и кодировка
0 diamond-nsk
 
02.07.15
09:56
Здравия желаю!
Возникла следующая ситуация, третий день не могу сам разобраться...
Подключаюсь из 1С 8.3 через Внешние источники данных к мускулю, данные получаю - всё ОК, но русские буквы получаются кракозябрами: Щербаков Александр Сергеевич

В самом Мускуле:
"character_set_client"        "utf8"
"character_set_connection"    "utf8"
"character_set_database"    "utf8"
"character_set_filesystem"    "binary"
"character_set_results"        "utf8"
"character_set_server"        "latin1"
"character_set_system"        "utf8"

Если подключиться к базе через какой-нибудь HeidiSQL - в табицах отображаются такие же кракозябры. В софте-владельце базы, который в эту базу, собсна, и пишет  (UTM5) - всё ОК отображается.

Строка подключения:
Driver={MySQL ODBC 5.3 Unicode Driver};
Server=хх.хх.хх.хх;
port=3306;
Database=ххх;
User=ххх;
Password=ххх;

Пробовал добавлять в строку подключения:
STMT=SET CHARACTER SET utf8;
или
STMT=SET CHARACTER SET latin1;
или
STMT=SET CHARACTER SET cp1251;
- на результат никак не влияет, даже вид кракозябр не меняется...

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

Что я делаю не так, и что еще можно попробовать сделать/проверить?
1 diamond-nsk
 
02.07.15
10:02
UPD: на форуме не так кракозябры мои отобразились:
http://s009.radikal.ru/i308/1507/16/d8d8290c0af2.png

вроде как это latin1 (cp1252)
2 Лефмихалыч
 
02.07.15
10:03
(0) у таблицы чарсет и коллэйшн какие?
3 diamond-nsk
 
02.07.15
10:18
(2) В коде CREATE таблицы чарсет не нашел, а COLLATE='latin1_swedish_ci'
4 Salimbek
 
02.07.15
10:29
(3) Ну дык логично тогда, что крышу сносит. Закинул для теста туда: http://www.artlebedev.ru/tools/decoder/
Ответ: Щербаков... (CP1252 ? UTF-8)
5 diamond-nsk
 
02.07.15
10:53
(4) Ага, там же проверял, такой же результат.
Какие мне действия предпринять, чтобы корректно выдергивать инфу в 1С? UMT5 как-то же работает с этой БД, корректно отображая русские символы.
6 Лефмихалыч
 
02.07.15
11:16
(5) ALTER TABLE db_table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
7 Лефмихалыч
 
02.07.15
11:18
а потом при необходимости сконвертить символы в записях SELECT convert(cast(convert(LATIN1_FIELD using latin1) as binary) using utf8)
  FROM LATIN1_TABLE;
8 Лефмихалыч
 
02.07.15
11:20
там скорее всего в поле с коллэшном latin1_swedish_ci сохранены буквы из таблицы cp1252, которые ты в 1С пытаешься читать, как utf8_general
9 Лефмихалыч
 
02.07.15
11:21
+(8) я не знаю способов (хотя они наверняка есть) в 1С при чтении налету конвертить буквы, по этому предлагаю записывать без вот этих трюков cp1251>>latin1
10 diamond-nsk
 
02.07.15
12:49
(6) (7) Это, я так понимаю (простите, не великий спец - учусь), сконвертит саму таблицу в mysql и перекодирует символы в строках в "правильную" кодировку. Загвоздка в том, что это биллинг провайдера, конвертить таблицы которого мне, ессно дело, не дадут, на селект-то еле выбил доступ :)
Тем более что он, биллинг, крутиться 24/7, непрерывно записывая сессии и траф около 15к абонентов + 6 операторов постоянно пялят в этот биллинг, и секир-башка будет, если что-то хоть на чуть-чуть остановится.
Поэтому остаётся только вариант как-то "на лету" конвертить записи из этой биллинговой мускульной БД либо при подключении из 1С к MySQL, либо при выполнении SQL-запроса к БД, либо при обработке результатов выполнения запроса в 1С.
При подключении в строке подключения указывая "STMT=SET CHARACTER SET latin1" - не реагирует.
В SQL-запросе - нет возможности что-то такое указать, т.к. их выполняет сама 1C, транслируя свой псевдо-sql в реальный sql через объект "Внешний источник данных".
А конвертить результаты запроса в другую кодировку 1С штатными средствами не умеет, пичааааль :(
11 diamond-nsk
 
02.07.15
12:50
UPD к (10) на всякий: данные мне нужно только читать из MySQL в 1С.
12 Salimbek
 
04.07.15
11:41
(11) Ну если никто за тебя не декодирует данные, то логичный вывод - декодируй сам. В качестве самого крайнего варианта - составляешь два массива: 1 - массив "А"-"Я" "а"-"я" и второй - находишь соответствие каждой букве, типа "?" - "Р", а далее каждую буковку преобразуешь. Или, можно, свою нормальную базу создать и выкачивать данные от провайдера в свою базу запросом, типа как в (7) советуют. И уже оттуда вытаскивать данные для 1С.
13 ДенисЧ
 
04.07.15
11:44
А в чём проблема декодинга?