|
Формир-е PSQL-объектов с кириллицей в тексте: проблемы на linux'e при любом чарсете
|
|||
---|---|---|---|
#18+
hi all Много букв, извиняйте. Топик-памятка (себе и остальным). Появилось два вопроса. 1) почему при работе с базой, расположенной на LINUX , утилитой isql, расположденной на WINDOWS , в базу невозможно передать скрипт, создающий PSQL-объект с кириллицей в своем теле. В итоге, будет либо ошибка (malformed string) либо тело PSQL-объекта окажется с кракозябрами. 2) почему при работе с базой, расположенной на LINUX , утилитой isql, расположденной на LINUX , выполнить аналогичную п. 1 задачу можно ТОЛЬКО в одном случае: если *не* указывать в строке коннекта параметр чарсета (т.е. ключик -ch). А база, вроде бы, может быть создана с любым чарсетом. Ниже приведены 4 варианта (по два на каждый тип расположения скрипта и утилиты isql). РАЗДЕЛ 1. Cкрипт и isql - на WINDOWS машине. В windows-блокноте создан скрипт, сохранён в файле trgsample.sql : Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Вариант 1. Эксперимент с базой, созданной с чарсетом WIN1251 . Код: plaintext 1. 2.
1.1 Запускаю isql с виндовой машины: Код: plaintext
Код: plaintext 1. 2. 3. 4.
1.2 Повторяю эту команду, но добавляю к ней ключик с указанием чарсета коннекта: Код: plaintext
Открываю базу в ИБЭ, смотрю в триггер - кракозябры : Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Вариант 2. Эксперимент с базой, созданной с чарсетом NONE . Код: plaintext 1. 2.
2.1 Натравливаю на скрипт с триггером isql, указывая базу tmpnone.fdb, без ключика -ch: Код: plaintext 1. 2. 3. 4. 5. 6.
2.2 Повторяю п. 2.1, только добавляю опять ключик с чарсетом: Код: plaintext
Опять иду в ИБЭ, открываю базу tmpnone, в триггере - снова кракозябры : Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
РАЗДЕЛ 2. Cкрипт и isql - на LINUX машине. Иду в PUTTy, запускаю там mc, ввожу текст: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Вариант 3. База tmp1251 (default charset = win1251) 3.1 Код: plaintext
Открываю базу в ИБЭ, иду в триггер - читабельный , кракозябр нету. 3.2 Теперь добавляю ключик -ch win1251: Код: plaintext
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Вариант 4. База tmpnone (default charset = none) 4.1 Код: plaintext
4.2 Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 17:04 |
|
Формир-е PSQL-объектов с кириллицей в тексте: проблемы на linux'e при любом чарсете
|
|||
---|---|---|---|
#18+
Hello, Таблоид! You wrote on 13 декабря 2011 г. 17:07:41: ТаблоидМного букв, извиняйте. Топик-памятка человек-памятник... -- With best regards, Мимопроходящий. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 17:11 |
|
Формир-е PSQL-объектов с кириллицей в тексте: проблемы на linux'e при любом чарсете
|
|||
---|---|---|---|
#18+
Таблоид РАЗДЕЛ 1. Cкрипт и isql - на WINDOWS машине. Чарсет консоли на Windows какой? 866? -- BR, Евгений ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 17:23 |
|
Формир-е PSQL-объектов с кириллицей в тексте: проблемы на linux'e при любом чарсете
|
|||
---|---|---|---|
#18+
Да и в Linux, похоже, то же самое - charset консоли utf-8, а isql, по-видимому, работает с ним как с win1251 -- BR, Евгений ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 17:30 |
|
Формир-е PSQL-объектов с кириллицей в тексте: проблемы на linux'e при любом чарсете
|
|||
---|---|---|---|
#18+
Кузнецов ЕвгенийЧарсет консоли на Windows какой? 866?он самый :( Если этот чарсет консоли такой колючий, что на всё влияет, то как его поменять, но чтобы "навсегда" (т.е. с сохранением после рестарта компа) ? И почему он приводит к кракозябрам в варианте 1.2 - там и база с чарсетом 1251 и коннект тоже с ним. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 17:31 |
|
Формир-е PSQL-объектов с кириллицей в тексте: проблемы на linux'e при любом чарсете
|
|||
---|---|---|---|
#18+
Таблоидон самый :( Если этот чарсет консоли такой колючий, что на всё влияет, то как его поменять, но чтобы "навсегда" (т.е. с сохранением после рестарта компа) ? В google запрос "cmd кодовая страница по умолчанию" выдаст на первой же странице страницу с нужным ключом реестра. ТаблоидИ почему он приводит к кракозябрам в варианте 1.2 - там и база с чарсетом 1251 и коннект тоже с ним. По-видимому, isql берет текст в формате консоли и сharset коннекта роли не играет. Ну вот если просматривать в любом Windows-редакторе командный файл с русскими комментариями в 866, там ведь тоже "крякозябры" будут. -- BR, Евгений ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 17:48 |
|
Формир-е PSQL-объектов с кириллицей в тексте: проблемы на linux'e при любом чарсете
|
|||
---|---|---|---|
#18+
Мимопроходящийчеловек-памятник... Человек-хомячок. В Windows всего две русские кодировки, но и в них он умудрился запутаться. В Linux их четыре, лучше туда вообще не соваться. Всю эту памятку надо выкинуть к ЧМ и заменить одним предложением из FAQ: Character set скрипта должен всегда соответствовать character set-у, указанному командой SET NAMES . Точка. Набираешь команды в консоли, где chcp показывает 866 - указывай SET NAMES DOS866 В консоли 1251 или GUI приложении - SET NAMES WIN1251. Скармливаешь их из файла - кодировку файла (может быть и UTF8). То же самое под Linux, только вместо chcp - locale. Это в самом деле так сложно?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 18:01 |
|
Формир-е PSQL-объектов с кириллицей в тексте: проблемы на linux'e при любом чарсете
|
|||
---|---|---|---|
#18+
В google запрос "cmd кодовая страница по умолчанию" выдаст на первой же странице страницу с нужным ключом реестра. Хотя нет, способ с подменой Nls, кривой все же. Вроде есть еще варианты правки HKCU/Console, но официальных ссылок не видел, надо смотреть. -- BR, Евгений[/quot] ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 18:01 |
|
Формир-е PSQL-объектов с кириллицей в тексте: проблемы на linux'e при любом чарсете
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovВсю эту памятку надо выкинуть к ЧМ и заменить одним предложением из FAQ: Character set скрипта должен всегда соответствовать character set-у, указанному командой SET NAMES .По сути - правильно. Но вот только формулировка наоборот - в чарсете коннекта нужно указывать чарсет скрипта ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 18:18 |
|
Формир-е PSQL-объектов с кириллицей в тексте: проблемы на linux'e при любом чарсете
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovНабираешь команды в консоли, где chcp показывает 866 - указывай SET NAMES DOS866 В консоли 1251 или GUI приложении - SET NAMES WIN1251. Скармливаешь их из файла - кодировку файла (может быть и UTF8). То же самое под Linux, только вместо chcp - locale. Это в самом деле так сложно?..Это сейчас, после твоего объяснения и проверки, - нет, не сложно. Получилось. И спасибо за ответ. Только вопросик остается. Вот создал я файл trigger_sample.sql в кодировке WIN1251 (в блокноте, ФАРе - неважно). Дальше иду в cmd.exe (а там по дефолту эта старая cp=866), запускаю isql. Устанавливаю там SET NAMES WIN1251 - т.е. явно говорю ему, в какой кодировке дальше будет "общение". Ввожу далее CONNECT TESTR.FDB и затем даю на выполнение скрипт trigger_sample.sql. СУБД Firebird НЕ ругается (см вариант 1.2), но в тело триггера пишет по тихому кракозябры. Получается, он берёт чарсет из chcp, а на мою команду set names (или ключик -cp) ему плевать с колокольни. Если не так, то чем объяснить, что консольная установка chcp перешибает команду set names ? Dimitry Sibiryakov Character set скрипта должен всегда соответствовать character set-у, указанному командой SET NAMES .При работе c БД, расположенной на LINUX'e, из-под виндового ISQL, это утверждение НЕ ВЕРНО. Я могу набрать скрипт в блокноте виндузы ("Character set скрипта" = 1251), а скармливать его серверу из cmd или его оболочки (FAR'a) с кодировкой 866. И тогда всё обломится, даже если укажу SET NAMES WIN1251. BTW, ты же мне говорил (в личке), что у тебя там есть какой-то линух на VM. Проверь, если будет время. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 18:44 |
|
Формир-е PSQL-объектов с кириллицей в тексте: проблемы на linux'e при любом чарсете
|
|||
---|---|---|---|
#18+
Таблоидзатем даю на выполнение скрипт trigger_sample.sql. Как "даёшь"? Командой INPUT? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 19:16 |
|
Формир-е PSQL-объектов с кириллицей в тексте: проблемы на linux'e при любом чарсете
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovКак "даёшь"? Командой INPUT?и так пробовал, и через ключик '-i' (но тогда еще и ключик -cp win1251 юзал). ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 19:19 |
|
Формир-е PSQL-объектов с кириллицей в тексте: проблемы на linux'e при любом чарсете
|
|||
---|---|---|---|
#18+
Таблоиди так пробовал, и через ключик '-i' (но тогда еще и ключик -cp win1251 юзал). А ты уверен, что не через меню "Редактирование"-"Вставить"?.. Потому как какой ещё, нахрен, ключик -i после ручного ввода команды CONNECT?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 19:22 |
|
Формир-е PSQL-объектов с кириллицей в тексте: проблемы на linux'e при любом чарсете
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovА ты уверен, что не через меню "Редактирование"-"Вставить"?.. Потому как какой ещё, нахрен, ключик -i после ручного ввода команды CONNECT?..Не, я файл предварительно создал в редакторе FAR'a. Ключик '-i' - это я про то, что скрипт можно ведь не только INPUT'ом скармливать ("внутри" консоли isql), но еще и указывать как аргумент командной строки: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 19:32 |
|
Формир-е PSQL-объектов с кириллицей в тексте: проблемы на linux'e при любом чарсете
|
|||
---|---|---|---|
#18+
Таблоид1.2 Повторяю эту команду, но добавляю к ней ключик с указанием чарсета коннекта: C:\1INSTALL\FIREBIRD\FB_2_5\bin\isql 192.168.0.61:/u01/db/firebird/tmp1251.fdb -i trgsample.sql -ch win1251 не верю. декодер нам говорит, что он перекодировал из 866. Вопрос - В какой кодировке файл trgsample.sql? Еще раз напомню, что у блокнота есть шрифт Terminal, который показывает текст в 866. Fixedsys показывает в 1251. То есть, если в блокноте в файл вбиты символы 1251, то что - isql их перекодирует в 866??? Таблоид(в блокноте, ФАРе - неважно). важно. в виндовом блокноте видно "кодировку", см. выше. в ФАРе - понятия не имею, в какой кодировке он создает текстовый файл, и в каком виде его импортирует isql. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 20:01 |
|
Формир-е PSQL-объектов с кириллицей в тексте: проблемы на linux'e при любом чарсете
|
|||
---|---|---|---|
#18+
В общем, приведу постановку задачи по манипуляциям с телесами PSQL-объектов, содержащих кириллицу (в примере - триггер) и её решение. Может, кому еще пригодится (мне - точно, и еще не один раз) Дано: * база-источник (production) с большим числом констрейнтов, индексов и - что самое важное - активных триггеров. В триггерах идёт весьма много преобразований, обращений к разным таблицам, проверок етц. В метаданные этой базы разработчиками могут вноситься разные изменения - в том числе в констрейнты, индексы и триггера. Тела триггеров могут содержать кириллицу, разумеется. * база-приемник - изначально создана как точная копия базы источника (со всем вышеописанным барахлом) * репликатор, который журналирует изменения в базе-источнике и по расписанию перетаскивает обновленные данные в бд-приемник. * обе базы расположены на разных LINUX-серверах, у которых locale = UTF8; character set обеих баз = WIN1251. Требуется: * в базе-приемнике: убрать все констрейнты и индексы, за исключением not_null'ов и первичных ключей * в базе-приемнике: удалить все триггеры * при аварии БД-источника - восстановить не только последние данные по БД-приемнику, но и все метаданные, которые были в БД-источнике на самый последний момент. То есть, должен быть скрипт, регулярно запускаемый cron'ом и натравливаемый на БД-источник. Этот скрипт должен создать .sql-файл - полное описание имеющихся в БД-источнике констрейнтов, индексов и триггеров. При аварии БД-источника этот файл с DDL-командами будет применён к target_БД, в итоге должна будет получиться база, максимально приближенная к потерянной. В итоге, достаточно быстро получилось сбацать (см аттач): 1) скрипт, удаляющий констрейнты, индексы и триггеры; 2) скрипт, извлекающий DDL всех индексов (а если они связаны с UNIQUE или FK-констрейнтами, то DDL констрейнтов[+ индексов]); 3) скрипт, извлекающий тело триггеров и прилепливающий к ним сверху нужные шапки (before/after insert/update/delete). Основной же гемор случился извлечением триггеров с кириллицей и, как теперь понимаю, с чарсетом той консоли, с которой вводится isql и скрипт на выполнение с полученным DDL триггеров. Итак, решение. Создаю пустую базу с чарсетом = 1251: Код: sql 1. 2. 3. 4.
Далее подключаюсь к ней в ИБЭ и ввожу в его script executive: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Запускаю PUTTy, нахожу базу, и ввожу следующую команду: Код: sql 1.
- в которой: * скрипт trg_ddl_extract.sql - достает DDL всех триггеров (см аттач) * чарсет коннекта utf8 - это то, что я вижу в выводе команды locale * перевод вывода на вход потоковому редактору sed с reg_exp'ом - это отсечка хвостовых пробелов в результате работы isql, коих рождается великое множество (isql, как я понял, НЕ умеет делать это) * результат extracted_trigger_ddl.txt - то, что надо держать в надежном месте, чтобы применить на случай аварии БД-исчтоника к стендбаю репликатора В новом файле extracted_trigger_ddl.txt вижу наконец-то читабельный текст: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Сохраняю файл, затем натравливаю его на isql как скрипт со стандартной DDL-инструкцией создания триггера: Код: sql 1.
Снова вхожу в ИБЭ, смотрю в триггер - победа! Весь текст читабельный, крабозябр нету. Код: plaintext
DEL_FK_UK_IDX_TRIGS.sql - генерит скрипт для удаления всех констрейнтов, за исключением всех PK и всех not_null'ов (PK оставлены сознательно: их индексы позволят репликатору выполнять DML над базой приемником с максимальной скоростью) IDX_DDL_EXTRACT.sql - генерит скрипт (пере)создания всех имеющихся индексов (если индекс обусловлен констрейнтом, то DDL будет создана именно по констрейнту, а не по индексу; индекс создастся автоматом) TRG_DDL_EXTRACT.sql - генерит скрипт (пере)создания всех имеющихся триггеров. Первый скрипт надо применить к БД-источнику, а его результат (стандартный DDL-скрипт) - к БД-приемнику, перед началом работы репликатора. Это приведет к удалению "обременяющих" индексов, констрейнтов и триггеров. Последние два скрипта надо запускать cron'ом (натравливать их на продакшен) и сохранять их результат в надежном месте, например - отправлять на почту админу. При аварии продакшена результат этих двух скриптов нужно будет применить к бывшей базе-приемнику, в которую шла запись репликатора. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 20:13 |
|
Формир-е PSQL-объектов с кириллицей в тексте: проблемы на linux'e при любом чарсете
|
|||
---|---|---|---|
#18+
kdvТо есть, если в блокноте в файл вбиты символы 1251, то что - isql их перекодирует в 866??? Да, если скармливать их ему через буфер обмена. kdvв виндовом блокноте видно "кодировку", см. выше. в ФАРе - понятия не имею Видно. Прямо на лбу. Чёрным по грязно-голубому написана кодовая страница. А вот в блокноте я что-то не вижу... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 20:29 |
|
Формир-е PSQL-объектов с кириллицей в тексте: проблемы на linux'e при любом чарсете
|
|||
---|---|---|---|
#18+
kdvв ФАРе - понятия не имею, в какой кодировке он создает текстовый файлСудя по всему, ты прав: проверил содержимое того файла командой type - а она вместо кракозябр выдает читабельный текст в кодироке 866. Проверил только что еще раз, аккуратно. Претензии по примеру 1.2 исходного поста отменяются. При указании ключика -ch win1251 файл с кириллицей, созданный в кодировке 1251, отображается в тело триггера без искажений. Даже если намеренно перед вызовом isql вернуть назад chcp 866! В общем, способ извлечения кириллицы и записи её с помощью isql стал понятным. Почти :-) 2 DS : спасибо еще раз за наводку. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 20:38 |
|
|
Start [/forum/topic.php?fid=40&tid=1566212&gotonew=1]: |
0ms |
get settings: |
0ms |
get forum list: |
9ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
9ms |
get first new msg: |
2ms |
get forum data: |
1ms |
get page messages: |
33ms |
update_topic_read_status (1566212): 13.12.2011 20:38:25: |
0ms |
get tp. blocked users: |
0ms |
get online users: |
33ms |
check new: |
1ms |
others: | 100ms |
total: | 226ms |
0 / 0 |