![]() |
![]() |
![]() |
|
Внешний источник данных 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
|
А в чём проблема декодинга?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |