Преобразование MS Access *.MDB в MySQL или SQLite, проблема в кодировании данных

#linux #sqlite #ms-access #encoding #codepages

#linux #sqlite #ms-access #кодирование #кодовые страницы

Вопрос:

Приветствую, я представлю свой случай:

  • Я нахожусь в linux UBUNTU
  • у меня есть несколько Jet3 .MDB (база данных MS Acess) размером около 500 МБ каждая, в которых данные закодированы в cp1256 / WINDOWS-1256
  • я создал базы данных sqlite, следуя этой статье, чтобы выполнить преобразованиеhttp://cltb.ojuba.org/en/articles/mdb2sqlite .

Вот скрипт bash, который я создал для преобразования базы данных. Предполагая, что у меня есть MS Access x.MDB

 mdb-schema "x.mdb" | perl -wpe 's%^DROP TABLE %DROP TABLE IF EXISTS %i;
  s%(Memo/Hyperlink|DateTime( (Short))?)%TEXT%i;
  s%(Boolean|Byte|Byte|Numeric|Replication ID|(w  )?Integer)%INTEGER%i;
  s%(BINARY|OLE|Unknown ([0-9a-fx] )?)%BLOB%i;
  s%s*(d )s*(,?[ t]*)$%${1}%;' | sqlite3 > x.db 

for i in $(mdb-tables "x.mdb"); do echo $i; (
echo "BEGIN TRANSACTION;";
MDB_JET3_CHARSET="WINDOWS-1256" mdb-export -R ";n" -I "x.mdb" $i;
echo "END TRANSACTION;" ) | sqlite3 "x.db"; done
  

Я попытался изменить MDB_JET3_CHARSET на WINDOWS-1256, cp1256, WINDOWS-1251, cp1251, UTF-8. некоторые из них выдают разные результаты в данных, когда я просматриваю их, но по-прежнему не имеют никакого смысла вообще.

спасибо ранее и извините за мой плохой английский

Комментарии:

1. привет! попробуйте добавить Charset = cp1251 в строку подключения

2. привет @evgeniy. labunskiy спасибо за комментарий, я попытался изменить mdb_jet3_charset на несколько форматов, чтобы noavail. я отредактировал свой вопрос, чтобы включить созданный мной скрипт.

Ответ №1:

Хорошо, тогда, поиграв на многих сайтах, я наткнулся на это http://git.ojuba.org/cgit/thawab/tree и нашел скрипт, который дает мне идею (это bok2ki.py , если кому-то интересно), я ЛЮБЛЮ OPEN SOURCE !! 🙂

Я добавляю параметр MDB_ICONV с «UTF-8» в качестве его значения и изменяю значение параметра MDB_JET3_CHARSET на «cp1256»

на самом деле я действительно не знаю, что это за параметр на самом деле, но я предполагаю, что кодировка MDB_JET3 предназначена для определения кодировки / encoding / codepages (я действительно не знаю разницы, я должен исследовать больше), а MDB_ICONV — для определения кодировки целевой базы данных. в любом случае, это всего лишь мое предположение.

тогда вот мой новый скрипт:

 mdb-schema "x.mdb" | perl -wpe 's%^DROP TABLE %DROP TABLE IF EXISTS %i;
  s%(Memo/Hyperlink|DateTime( (Short))?)%TEXT%i;
  s%(Boolean|Byte|Byte|Numeric|Replication ID|(w  )?Integer)%INTEGER%i;
  s%(BINARY|OLE|Unknown ([0-9a-fx] )?)%BLOB%i;
  s%s*(d )s*(,?[ t]*)$%${1}%;' | sqlite3 x.db 

for i in $(mdb-tables "x.mdb"); do echo $i; (
echo "BEGIN TRANSACTION;";
MDB_JET3_CHARSET="cp1256" MDB_ICONV="UTF-8" mdb-export -R ";n" -I "x.mdb" $i;
echo "END TRANSACTION;" ) | sqlite3 "x.db"; done
  

Комментарии:

1. хм, я пытался установить этот ответ в качестве принятого ответа, но мне приходится ждать 15 часов, потому что это мой собственный ответ. это своего рода отстой.

2. Я думаю, что это MDBICONV не MDB_ICONV .