Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / SQLite Новый топик    Ответить
 Sqlite3: .import csv: русские буквы отображаются в виде "?".  [new]
tcheo
Member

Откуда:
Сообщений: 7
Пожалуйста, помогите разобраться, что необходимо в настройках Sqlite3, чтобы команда .import могла заимпортить cvs с русскими буквами.

sqlite> .mode csv
sqlite> .separator ;
sqlite> .import d:/Test.csv Test

sqlite> .schema Test
CREATE TABLE Test(
"????????" TEXT,
"?????????" TEXT,
"???????" TEXT,
"?????" TEXT
);

CSV простая, для теста. Четыре колонки, заполненные русскими буквами.

Посмотрела статьи в интернете. Вроде должно работать. У меня Windows10. Sqlite3 скачала последний отсюда https://www.sqlite.org/download.html
22 окт 18, 12:20    [21710919]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite3: .import csv: русские буквы отображаются в виде "?".  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9417
По умолчанию, консоль использует OEM-ную кодовую страницу. Для русского это 866.
"Гуёвая часть", в свою очередь, использует ANSI-шную кодовую страницу. Для русского это 1251.
Чтобы консоль отображала русские буквы в ANSI-кодировке, нужно:
1. Задать для консоли TrueType-шрифт. Lucida или Consolas;
2. Сделать "chcp 1251" или в комстроке перезапуском оболочки sqlite или в самой этой оболочке (запуск системных команд).
22 окт 18, 16:41    [21711371]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite3: .import csv: русские буквы отображаются в виде "?".  [new]
tcheo
Member

Откуда:
Сообщений: 7
Спасибо! Проверила шрифт. Стоит шрифт ТТ Consolas,
C:\Users>chcp 1251
Текущая кодовая страница: 1251

Результат тот же. И если распечатать данные в базе, то вижу

sqlite>select * from Test
"????";"????????";1;149
"????";"?????????";2;124

Теперь в базу, импортированную из csv, руками добавляю что-нибудь по-русски:

sqlite> INSERT INTO Test VALUES("Русский", "проверяем", "смотрим" , "результат");
sqlite> select * from Test;

"????";"????????";1;149
"????";"?????????";2;124
"Русский";"проверяем";"смотрим";"результат"
22 окт 18, 18:21    [21711559]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite3: .import csv: русские буквы отображаются в виде "?".  [new]
Dima T
Member

Откуда:
Сообщений: 14031
Там везде utf-8 ожидается по умолчанию, странно что совет выше помог.
22 окт 18, 20:04    [21711645]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite3: .import csv: русские буквы отображаются в виде "?".  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9417
"По умолчанию" ожидается "системная кодировка". А это - ANSI.
Во что именно перекодируется системная кодировка внутри базы - вопрос отдельный.
23 окт 18, 14:48    [21712390]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite3: .import csv: русские буквы отображаются в виде "?".  [new]
Dima T
Member

Откуда:
Сообщений: 14031
Речь не о консоли (cmd.exe), а о консольной утилите (sqlite3.exe) для работы с базами sqlite. Она и сам движок sqlite работают с UTF-8
https://www.sqlite.org/version3.html
Support for UTF-8 and UTF-16
...
In the current implementation of SQLite, the SQL parser only works with UTF-8 text. So if you supply UTF-16 text it will be converted. This is just an implementation issue and there is nothing to prevent future versions of SQLite from parsing UTF-16 encoded SQL natively.
23 окт 18, 15:15    [21712421]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite3: .import csv: русские буквы отображаются в виде "?".  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9417
Вот мы делаем условный "read console" юникодной версии и получаем на выходе (сразу или с доп.шагом) UTF8 ...
"Внимание вопрос!" - с какой кодировкой работает сама "read console"?
23 окт 18, 15:18    [21712428]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite3: .import csv: русские буквы отображаются в виде "?".  [new]
Dima T
Member

Откуда:
Сообщений: 14031
Basil A. Sidorov
Вот мы делаем условный "read console" юникодной версии и получаем на выходе (сразу или с доп.шагом) UTF8 ...
"Внимание вопрос!" - с какой кодировкой работает сама "read console"?

Без разницы. Получаем кодировку консоли GetConsoleCP() и дальше при вводе конвертация из нее в UTF8, при выводе - наоборот, из UTF8.

PS Сюда глянь 21680375, я там точно такой же пример импорта давал и в файлах там UTF8.
23 окт 18, 15:27    [21712436]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite3: .import csv: русские буквы отображаются в виде "?".  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9417
Если бы "получаем кодировку консоли", то шаманство с chcp - не требовалось бы.
Раз требуется, то работают с кодировкой по умолчанию.
23 окт 18, 15:41    [21712459]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite3: .import csv: русские буквы отображаются в виде "?".  [new]
Dima T
Member

Откуда:
Сообщений: 14031
Basil A. Sidorov
Если бы "получаем кодировку консоли", то шаманство с chcp - не требовалось бы.
Раз требуется, то работают с кодировкой по умолчанию.

Оно и так не требовалось, хз зачем chcp тут упомянуто. Наверно поэтому 21710919:
Basil A. Sidorov
Посмотрела статьи в интернете.


Перевожу на понятный:
tcheo
Пожалуйста, помогите разобраться, что необходимо в настройках Sqlite3, чтобы команда .import могла заимпортить cvs с русскими буквами.

sqlite> .mode csv
sqlite> .separator ;
sqlite> .import d:/Test.csv Test

Это она импортировала из d:/Test.csv, который в неизвестно какой кодировке (подозреваю 1251). Заметь кодировка консоли тут ни при чем. Кодировка импорта никак не указывается. Импорт консоль не использует.

Затем продолжает эксперименты
tcheo
Теперь в базу, импортированную из csv, руками добавляю что-нибудь по-русски:

sqlite> INSERT INTO Test VALUES("Русский", "проверяем", "смотрим" , "результат");
sqlite> select * from Test;

"????";"????????";1;149
"????";"?????????";2;124
"Русский";"проверяем";"смотрим";"результат"

То что было импортировано так и осталось вопросами, а то что добавлено INSERT нормально отображается, т.к. тут нет проблем с кодировкой, см. мой пост 21712421
23 окт 18, 15:53    [21712468]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite3: .import csv: русские буквы отображаются в виде "?".  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9417
Всё не так просто ...
Если кодировать кирилицу в UTF8, а потом "разглядывать" эти байты как WIN1251, то будут не очень понятные, но очень характерные строки текста.

Если кодировать кирилицу в WIN1251, а потом "разглядывать" эти байты как UTF8, то будет "mailformed string". Случай специально подобранных бессмысленных буквосочетаний - не учитываем.

Отсюда вопрос - что вообще могло импортироваться из ANSI-кирилицы приложением, которое "умеет" только UTF8?
24 окт 18, 14:58    [21713671]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite3: .import csv: русские буквы отображаются в виде "?".  [new]
tcheo
Member

Откуда:
Сообщений: 7
Подскажите, пожалуйста, можем ли мы как-то влиять на кодировку в CSV? Чтобы там был UTF8?
24 окт 18, 15:47    [21713783]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite3: .import csv: русские буквы отображаются в виде "?".  [new]
tcheo
Member

Откуда:
Сообщений: 7
Или 1251?
24 окт 18, 15:51    [21713791]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite3: .import csv: русские буквы отображаются в виде "?".  [new]
tcheo
Member

Откуда:
Сообщений: 7
Dima T
Там везде utf-8 ожидается по умолчанию, странно что совет выше помог.

Не помог. Импортированная база не отображается в консоли. А INSERT русским текстом в любом случае добавляет и sqlite добавку корретно отображает.
24 окт 18, 17:20    [21713986]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite3: .import csv: русские буквы отображаются в виде "?".  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9417
tcheo
Подскажите, пожалуйста, можем ли мы как-то влиять на кодировку в CSV? Чтобы там был UTF8?
Виндовый блокнот позволяет выбрать кодировку при сохранении файла.

P.S.
При сохранении в UTF8 виндовый блокнот, зачем-то, лепит в начало файла B(yte)O(rder)M(ark).
Если, вдруг, будет мешать, то и от него можно избавиться, не прибегая к посторонним средствам.
24 окт 18, 17:52    [21714037]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite3: .import csv: русские буквы отображаются в виде "?".  [new]
Dima T
Member

Откуда:
Сообщений: 14031
tcheo
Dima T
Там везде utf-8 ожидается по умолчанию, странно что совет выше помог.

Не помог. Импортированная база не отображается в консоли.

Потому что это НЕ тоже самое что
tcheo
А INSERT русским текстом в любом случае добавляет и sqlite добавку корретно отображает.

В чем разница я выше описал.

Можно ли сделать импорт CSV в кодировке 1251? - не знаю, почитаю документацию на sqlite3.exe, вроде нельзя, но не уверен.

В общем случае элементарно решается, но не с помощью sqlite3.exe, надо лишь написать свой конвертер 1251 в utf-8
24 окт 18, 20:07    [21714221]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite3: .import csv: русские буквы отображаются в виде "?".  [new]
Dima T
Member

Откуда:
Сообщений: 14031
Для Sqlite3 не нашел как 1251 задать, но случайно наткнулся на скриншот SQLite Studio, там есть выбор кодировки.
+
Картинка с другого сайта.
25 окт 18, 07:10    [21714431]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite3: .import csv: русские буквы отображаются в виде "?".  [new]
tcheo
Member

Откуда:
Сообщений: 7
Спасибо)))). В UTF8 пробовали перекодировать. Вместо "?" появились буквы, но не те, что надо, бракозябры какие-то. Попробую UTF16.
25 окт 18, 10:11    [21714542]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite3: .import csv: русские буквы отображаются в виде "?".  [new]
tcheo
Member

Откуда:
Сообщений: 7
Спасибо большое. Попробовала перевести в UTF8 через виндовый notepad и база стала корректно читаться. До этого пытались через notepad++
25 окт 18, 14:57    [21714942]     Ответить | Цитировать Сообщить модератору
Все форумы / SQLite Ответить