Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2021, 12:14   #1
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,220
По умолчанию Кодировка БД CP1251, но данные записаны в UTF-8. Как исправить?

Возникла интересная ситуация. Есть сайт, сам сайт полностью работает в UTF-8. Однако БД имеет кодировку CP1251, и в такие строки записываются данные в UTF-8. Ожидаемо имеем в базе примерно следующее:

1.png

Потребовалось перенести этот сайт на другой хостинг. Делаю экспорт БД через phpMyAdmin, ну и получаю вот такое:

2.png

А надо все это безобразие привести в порядок. Вопрос в том, как мне получить нормальный дамп в кодировке utf-8?

Я попробовал сделать следующее: выполнить дамп в кодировке 1251, а затем файл открыть как utf-8. Идея была верная, но что-то пошло не так:

3.png

Видно, что уже появился нормальный русский текст, но почему-то буква "И" превратилась в "xD0?". В принципе можно сделать замену этих символов на буквы "И", но нет гарантий, что проблема только в букве "И". Может там и другие буквы также заглючат?

Так вот, как восстановить файл, чтобы в нем не было таких вот ошибок? И почему именно с буквой "И" что-то пошло не так, хотя остальной русский текст нормально отображается?
Arigato на форуме Ответить с цитированием
Старый 30.06.2021, 17:31   #2
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

Arigato, СУБД какая?

вот тут меняют кодировку в таблицах в мускуле https://www.reg.ru/support/hosting-i...tablic-v-mysql
Алексей1153 вне форума Ответить с цитированием
Старый 30.06.2021, 20:30   #3
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,220
По умолчанию

Не, к сожалению, это не работает. Тут просто меняется кодировка таблиц. А проблема в том, что таблицы были в 1251, но в них записывались данные в UTF-8. Надо именно перекодировать данные, а не просто сменить кодировку таблиц. Там сейчас в самих таблицах белиберда, если поменять кодировку, то белиберда никуда не денется.

Суть в том, что база данных в 1251, при подключении к MySQL тоже устанавливается кодировка в 1251, но весь сайт в utf8. В итоге сайт в принципе как бы работает, просто utf8 строки записываются в таблицы с кодировкой 1251 (записываются в виде ерунды, которая была показана выше на скриншотах). Потом из них же данные читаются, и на сайте они отображаются корректно.

Но мне нужно привести все это дело в порядок, чтобы через phpMyAdmin видеть нормальные строки в базе, а не закарючки.
Arigato на форуме Ответить с цитированием
Старый 30.06.2021, 20:37   #4
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

Arigato, у меня похожая беда с птицей 1.5 - база в 1251, но понадобилось хранить имена юзеров в utf8. Я туда текст загоняю, обратно тоже достаётся нормально (то есть, внутри программы то всё ок), но ibexpert показывает белиберду. Я на это просто забил.

Но можно же точно также поступить и сконвертировать - вычитать все поля, интерпретировать их как utf8. Затем пересоздать всю БД и записать всё правильно.

Возможно, это всё делается более умно, но я пока что не знаю, как )
Алексей1153 вне форума Ответить с цитированием
Старый 30.06.2021, 21:40   #5
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,220
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
база в 1251, но понадобилось хранить имена юзеров в utf8. Я туда текст загоняю, обратно тоже достаётся нормально (то есть, внутри программы то всё ок), но ibexpert показывает белиберду.
Да, именно так получается.

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Возможно, это всё делается более умно
Вот хотелось бы легкое решение найти. Можно, конечно, написать скрипт, который все данные перегонит, но ведь куда проще просто пересохранить файл дампа в другой кодировке. Однако непонятно, почему некоторые буквы (в частности, буква "И") ломаются. Зато другой русский текст прекрасно восстановился.
Arigato на форуме Ответить с цитированием
Старый 30.06.2021, 22:33   #6
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,758
По умолчанию

В notepad++ открой дамп, и перекодируй с учётом BOM
Alar вне форума Ответить с цитированием
Старый 12.07.2021, 22:08   #7
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,220
По умолчанию

Так и делал, итог:



Завтра опять вернусь к этой задаче. Попробую букву "И" автозаменой восстановить. Главное чтобы другие буквы не пострадали.

P.S. Хм, xD, это же 13, если в десятичной системе, то есть перевод строки. Кажется, есть намек на проблему - переводы строки перекодировались, в итоге в кодировке UTF-8 буквы, в коде которых есть 13, поломались. Осталось понять, как бы скачать файл без изменений в переводах строк, тогда должно все корректно открыться в кодировке UTF-8. Ну или таки ручная замена.

Последний раз редактировалось Arigato; 12.07.2021 в 22:12.
Arigato на форуме Ответить с цитированием
Старый 13.07.2021, 08:13   #8
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

Arigato, 13 - это 0x0D , а тут 0xD0
Алексей1153 вне форума Ответить с цитированием
Старый 16.07.2021, 17:51   #9
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,220
По умолчанию

Замена этих символов на букву "И" помогла, вроде других косяков в кодировке нет, и база нормально восстановилась. Правда Notepad++ такие символы заменять отказался, пришлось написать маленькую программульку, которая их позаменяла прямо в файле.

Непонятно только, почему вообще эта проблема вылезла...
Arigato на форуме Ответить с цитированием
Старый 17.09.2022, 14:55   #10
lexxus
Новичок
Джуниор
 
Регистрация: 17.09.2022
Сообщений: 1
По умолчанию

а зачем вообще нужна тогда кодировка для таблиц и бд, как вы думаете?
думал, что записи при запросе подвергаются какой-то перекодировке, а получается, что пишет utf в таблицу с кодировкой cp1251... т. е. нет перекодировки, тогда зачем вообще таблице она? ну какой от нее смысл тогда?
у меня просто что-то похожее, решил поискать в инете и толком ответа то не нашел в чем этот прикол тогда...
мож подскажете...
lexxus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перекодировка DBF файла из cp1251 в UTF-8 .scu C# (си шарп) 7 14.07.2012 02:04
Кодировка по умалчанию UTF-8 Bockarevs HTML и CSS 7 11.11.2010 17:16
Кодировка с cp1251 на utf8 в MySQL Droid БД в Delphi 1 13.03.2010 16:43
кодировка UTF-8 nimf Общие вопросы Delphi 4 18.01.2009 19:25
UTF-8 кодировка OrdJONY Общие вопросы Delphi 2 23.03.2008 16:56