Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Пишу программу которая извлекает данные из текстового файла в кодировке cp1254 (турецкий язык) и помещает их в таблицу базы данных Oracle с кодировкой CL8ISO8859P5. Для этого сделал таблицу с полями принимающими юникод (nvarchar2). Пробовал использовать библиотеку Encode, пробовал менять переменные окружения текущей сессии, но всё равно специфические турецкие буквы меняются на знаки вопроса (POL??PORT K??MYA SAN.VE T??C.A.??.) или в таблицу вставляются пустые строки. Если считанные данные вставлять в другой текстовый файл, то буквы сохраняются, и если сделать вставку из другой таблицы, где уже есть турецкие буквы, в таблицу используя запрос, минуя переменные, то буквы тоже сохраняются. Пробовал получить дамп строки до всех преобразований, получил POL\x{130}PORT K\x{130}MYA SAN.VE T\x{130}C.A.\x{15e}. Помогите пожалуйста, уже три недели мучаюсь. Код: php 1. 2. 3. Код: php 1. Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2013, 11:39 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
mops, Забудьте про все эти кодировки. Приводите всё к unicode. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 09:06 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
Gijadmops, Забудьте про все эти кодировки. Приводите всё к unicode. Да я бы с радостью, что в принципе и пытаюсь сделать Код: php 1. 2. Но в таблицу вставляются пустые значения. Пробовал приводить данные к utf8, тогда в таблицу вставляется POL????PORT K????MYA SAN.VE T????C.A.?????. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 13:51 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
Был бы мускуль, вам бы тут быстро кучу советов надавали, а так... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 14:03 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
mhx, Мне кажется здесь дело не в базе данных, а в способе передать в неё данные в нужном виде. Где то происходит неявная перекодировка данных, потому что схема insert into <table1> select <field> from <table2> проходит без проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 14:28 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
А с Ораклом через что соединяешься? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 14:36 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
S_Andrey_A, С помощью клиента ораклового ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 14:39 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
S_Andrey_A, Если ты про библиотеки, то использую в программе Код: php 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 14:43 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
Вернее только Код: php 1. Вот полный текст программы Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 14:50 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
А NLS_LANG какой выставлен? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 14:53 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
Ну получается ты все конвертируешь в UTF а Оракл ждет турецкие буквы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2013, 14:56 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
S_Andrey_A, Я пробовал разные NLS_LANG выставлять, не помогает. База данных имеет кодировку CL8ISO8859P5, она не поймёт турецкие буквы. Единственный выход создавать юникодные поля в таблице (nvarchar2). Именно в формате UTF там и хранятся данные, это проверено когда делал обратную операцию, извлекал данные и таблицы и конвертировал их в турецкую кодировку и вставлял в файл и отправлял туркам (из UTF-16BE в cp1254). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2013, 06:52 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
А sqlldr - точно не загружает? mopsБаза данных имеет кодировку CL8ISO8859P5, она не поймёт турецкие буквы а зачем ей говорить что они турецкие. Может ее обмануть и сказать что они как раз кирилические однобайтные 8859-5. При загрузке в поле varchar2. И перлу сказать то же самое. Байт - он байт и есть. Вот пусть и грузит. А как они потом покажуться - как клиент настроен? Ведь иногда же varchar2 поля выгружаются на нормальном (турецком) языке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2013, 10:28 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
Vladimir Baskakov, Не получится, в турецком языке есть буквы которых нет в кирилице, а с ними как раз и проблема, поэтому не получится сохранить их как кирилические. А выгрузка из таблицы и загрузка в таблицу проходила только с полями nvarchar2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2013, 10:51 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
Турецкая кодировка однобайтная? TR8MSWIN1254? И русская - однобайтная? Так в каком смысле в русском языке нет турецких букв, а в турецком - русских? если все 256 байтов - есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2013, 10:54 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
Vladimir Baskakov, Я вас понял. Сообщил программе что у меня файл написан на кирилице Код: php 1. Убрал все перекодировки и просто вставил то что извлёк в таблицу. По дампу видно что турецкие буквы были восприняты как русские POL\x{43d}PORT K\x{43d}MYA SAN.VE T\x{43d}C.A.\x{43e}. Получается строчка POLнPORT KнMYA SAN.VE TнC.A.о., но я не уверен что турки захотят что то городить у себя чтобы преобразовать эти русские буквы в свои турецкие, там нет программистов кто бы смог за это взяться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2013, 11:54 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
А тип поля какой - юникодный или "нормальный"? Я то говорю про varchar2, однобайтные поля. mopsпотому что схема insert into <table1> select <field> from <table2> проходит без проблем. какого типа поля в <table2> ? юникодные или однобайтные? Если турки уже съели varchar2 - поля в русской локализации базы - то пусть и дальше едят. (это конечно наверное нехорошо....) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2013, 12:03 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
Vladimir Baskakov, Попробовал вставлять в поля разных типов. Если включена переменная окружения $ENV{NLS_LANG} = "TURKISH_TURKEY.TR8MSWIN1254", то и в varchar2 и в nvarchar2 вставляется POL??PORT K??MYA SAN.VE T??C.A.??. Убрав эту строчку получается POLаНPORT KаНMYA SAN.VE TаНC.A.аО., и в varchar2 и в nvarchar2, видно что турецкие буквы заменились на два символа аН и аО. Хотя в дампе по прежнему показывается POL\x{43d}PORT K\x{43d}MYA SAN.VE T\x{43d}C.A.\x{43e}. А insert из таблицы в таблицу я делал на юникодных полях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2013, 12:37 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
Получается хоть я и указываю кодировку файла Код: php 1. Всё равно турецкие буквы считываются как юникодные, а при вставке четыре символа из юникодного кода разбиваются по два они уже отображаются, что является неверным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2013, 12:49 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
да не в этом дело. либо $dbh_ora->{pg_enable_utf8} = 1; либо use utf8; либо, что самое вероятное Encode::from_to($l_temp_3, 'cp1254', 'UTF-16BE'); - не надо ничего перекодировать! В UTF. Попробуйте убрать эти строчки, пусть байты будут просто байтами, как они прочлись из файла! (ну - по моему мнению). У вас в тех varchar2() полях где уже есть - такие же сырые байты и положены (вероятно) - ну или покажите определения полей где турецкие буковки залиты уже. Если Вы их через SQLPlus выгрузите - оно и будет видно. (наверное) залейте одну строчку через SQLLoader. Указав ему, что кодировка файла УЖЕ такая, как установлена в базе, и НЕ НАДО ничего делать кроме как заливать. НЕ НАДО решать какие буквы есть, каких - нет, не надо ничего перекодировать. Выгрузите пару строчек из таблиц где турецкие буковки нормальные через SQLPLus, посмотрите - будет ли кодировка 1254, если нет - какая? Выполните тест на перле - подконнектится, выполнить 1 жесткий инсерт без связанных переменных, безо всяких UTF. Правильно вставит? или нет. Потом его же с забинденными переменными, но без перекодировок, значения - константами в тексте скрипта. турецкими буквами в 1254. Пройдет? тогда прикручивайте чтение из файла и все остальное.... Ну а потом допиливайте с установками NLS_..... для переносимости между компьютерами с разными настройками...... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2013, 13:19 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
про юникод http://search.cpan.org/~pythian/DBD-Oracle-1.23/Oracle.pm CPAN use DBD::Oracle qw( SQLCS_IMPLICIT SQLCS_NCHAR ); ... $sth->bind_param(1, $value, { ora_csform => SQLCS_NCHAR } ); Говорят, что юникодные параметры надо биндить с довеском? не знаю, не пробовал. Дальше. Про $dbh_ora->{pg_enable_utf8} = 1; - гугл говорит, что это флаг от постргесса. На оракловой странице CPAN его нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2013, 13:32 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
дальше, попробуйте в среде разработки вставить запись с осмысленными турецкими буковками. Если получится - посмотрите на языковые параметры в select * from v$nls_parameters, выставьте аналогичные в PERL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2013, 13:45 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
ничего не говорили про NLS_NCHAR_CHARACTERSET. Он какой? Заведите тему аналогичную в разделе Oracle, там могут понять причину быстрее. прагма PERLDOCutf8 - Perl pragma to enable/disable UTF-8 (or UTF-EBCDIC) in source code http://perldoc.perl.org/utf8.html Не влияет на прочитывание файла. Только на интерпретацию исходника. Оно зачем? в перлушке юникодных турецких букв нет. Какой сейчас ип поля у text_tr ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2013, 13:55 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
Vladimir Baskakov, Дело в том что я сейчас тренеруюсь на базе данных своего предприятия, здесь кодировка русская, и турецкие буквы я сохранял в полях типа nvarchar2(500). В дальнейшем буду цепляться через дблинк к турецкой базе и сохранять данные там (изначально я тренеровался на турецкой базе, но затем когда у меня возникли трудности, чтобы не забивать канал связи частыми запусками программы, я переключил свои тренеровки на нашу базу, что наверное неправильно, нужно снова вернуться на использование турецкой базы). Через тот же дблинк я забирал данные из Турции и вставлял в "русскую" таблицу в поля с типом nvarchar2 по схеме insert into <table1> select <field> from <table2>. Прямую вставку из среды разработки я пробовал, в консоле запускал sqlplus, менял настройки сессии на турецкии и делал вставку. Вставку я делал в "русскую" базу в поле с типом nvarchar2. Параметр NLS_NCHAR_CHARACTERSET что в турецкой базе, что в нашей AL16UTF16 Убрал вызов use utf8 Тип поля text_tr - nvarchar2(500). Я сделал аналогичное поле text_vr с типом varchar2(500) и сразу пробую вставить и в него. Про довесок в параметрам вставке я встречал в просторах интернета и пробовал некоторые, они реально меняют результат вставки, но пока не нашёл все возможные значения этого параметра. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2013, 15:31 |
|
||
|
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
|
|||
|---|---|---|---|
|
#18+
Vladimir Baskakov, Отказался от всех перекодировок, сделал в турецкой таблице поле с типом varchar2 и пробую вставить данные из файла туда. До этого пытался вставить в поля с типом nvarchar2, не знаю что на меня нашло, для их базы это же родной язык и она кодировку воспримет и без юникода. Но пока тоже не получается, если менять настройки сессии $ENV{NLS_LANG} = "TURKISH_TURKEY.TR8MSWIN1254"; то вставляется POL??PORT K??MYA SAN.VE T??C.A.??., если убрать смену настроек сессии, то вставляется POLФАPORT KФАMYA SAN.VE TФАC.A.Х?. Попробую порыть в сторону довеска к параметрам вставки. Спасибо за помощь Владимир, о результатах отпишусь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2013, 15:41 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=38245292&tid=1463836]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 356ms |

| 0 / 0 |
