{"id":694,"date":"2011-03-03T15:14:07","date_gmt":"2011-03-03T13:14:07","guid":{"rendered":"http:\/\/touk.pl\/blog\/?p=694"},"modified":"2023-03-23T13:33:10","modified_gmt":"2023-03-23T12:33:10","slug":"import-z-bazy-z-blednym-kodowaniem","status":"publish","type":"post","link":"https:\/\/touk.pl\/blog\/2011\/03\/03\/import-z-bazy-z-blednym-kodowaniem\/","title":{"rendered":"<!--:pl-->import z bazy z b\u0142\u0119dnym kodowaniem<!--:-->"},"content":{"rendered":"<p>Ostatnio musia\u0142em importowa\u0107 dane z bazy danych z kodowaniem w kt\u00f3rej zachodnioeuropejskiego w kt\u00f3rej\u00a0by\u0142y przechowywane polskie znaki. By\u0142o z tym troch\u0119 problem\u00f3w, wi\u0119c opisz\u0119 rozwi\u0105zanie<\/p>\n<p><strong>Zagadnienie<\/strong> Baza A &#8211; \u017ar\u00f3d\u0142owa, u klienta. Kodowanie zachodnioeuropejskie WE8DEC. Przechowywane s\u0105 w niej jednak polskie znaki w kodowaniu EE8ISO8859P2 czyli ISO-8859-2. Takie kodowanie stosuje klient bazy. Oracle pozwala na takie kombinacje. Mia\u0142em kiedy\u015b do czynienia z baz\u0105 danych w kodowaniu US7ASCII, kt\u00f3ra te\u017c przechowywa\u0142a polskie znaki, mimo \u017ce to kodowanie zawiera tylko na znaki do kodu 127 a wi\u0119c bez narodowych. Mo\u017cna zapisywa\u0107 lub odczytywa\u0107 dane z poziomu klienta tak aby konwersje nie mia\u0142y miejsca &#8211; dzi\u0119ki temu obce kodowanie nie przeszkadza. Problem pojawi\u0142 si\u0119 przy dost\u0119pie przez DB linki, ale o tym za chwil\u0119. Baza B &#8211; docelowa, u nas. Optymalne kodowanie AL32UTF8 pozwalaj\u0105ce przechowywa\u0107 wszystkie znaki \u0142\u0105cznie ze wschodnioazjatyckimi. <!--:--><\/p>\n<p><strong>Pr\u00f3ba rozwi\u0105zania<\/strong> Pierwsza pr\u00f3ba importu polega\u0142a na wykonaniu insert into \/<em>tabela z B<\/em>\/ select &#8230; from \/<em>tabela z A<\/em>\/. Przy takiej operacji Oracle robi\u0142 konwersj\u0119 znak\u00f3w z kodowania zachodnioeuropejskiego na unicode. W efekcie otrzymywali\u015bmy &#8220;krzaczki&#8221;, ale by\u0142y to r\u00f3\u017cne &#8220;krzaczki&#8221;, tak si\u0119 przynajmniej na pocz\u0105tkowo wydawa\u0142o. Skoro literka \u0104 ma w kodowaniu ISO 8859-2 kod 0xA1 a pod tym kodem w ISO 8859-1\u00a0widnieje znak \u00a1, wi\u0119c importowa\u0142 si\u0119 np. ZWI\u00a1ZEK. Wydawa\u0142o si\u0119, \u017ce wystarczy tylko dopisa\u0107 funkcj\u0119 konwertuj\u0105c\u0105 odpowiedni &#8220;krzaczek&#8221; na odpowieni polski znak i b\u0119dzie po k\u0142opocie. Okaza\u0142o si\u0119 jednak, \u017ce literki \u015a i \u017b konwertuj\u0105 si\u0119 na ten sam symbol \ufffd\u00a0oznaczaj\u0105cy nieznany znak. <strong>Rozwi\u0105zanie<\/strong> Pojawi\u0142 si\u0119 pomys\u0142, aby funkcj\u0105 utl_raw.cast_to_raw\u00a0skonwertowa\u0107 oryginalny VARCHAR2 z systemu A na tym RAW, potem zaimportowa\u0107 do B i tam funkcj\u0105 utl_raw.cast_to_varchar2\u00a0przekszta\u0142ci\u0107 z RAW na VARCHAR2 omijaj\u0105c po drodze konwersj\u0119. Okaza\u0142o si\u0119 jednak, \u017ce podczas odwo\u0142ywania si\u0119 z B do A poprzez dblink konwersja nast\u0119puje przed wywo\u0142aniem \u00a0utl_raw.cast_to_raw i to mimo wymuszenia, aby funkcja si\u0119 wykonywa\u0142a na zdalnym serwerze. Konieczne okaza\u0142o si\u0119 utworzenie na A widok\u00f3w zwracaj\u0105cych wynik operacji utl_raw.cast_to_raw na polach z polskimi znakami. Dzi\u0119ki temu poprzez dblink importowane s\u0105 z A do B tablice bajt\u00f3w typu RAW. Potem mo\u017cna w B przekonwertowa\u0107 wpis z RAW do VARCHAR2, ale najpierw trzeba przekszta\u0142ci\u0107 odebran\u0105 tablic\u0119 bajt\u00f3w aby tekst zapisany w niej w kodowaniu EE8ISO8859P2 zosta\u0142 przekszta\u0142cony na tekst zapisany w kodowaniu bazy B &#8211; AL32UTF8. Polecenie wygl\u0105da wi\u0119c nast\u0119puj\u0105co utl_raw.cast_to_varchar2(utl_raw.convert(kolumna_z_polskimi_znakami, &#8216;AMERICAN_AMERICA.AL32UTF8&#8217;, &#8216;AMERICAN_AMERICA.EE8ISO8859P2&#8217;)) i rozwi\u0105za\u0142o problem konwersji.<\/p>\n","protected":false},"excerpt":{"rendered":"Ostatnio musia\u0142em importowa\u0107 dane z bazy danych z kodowaniem w kt\u00f3rej zachodnioeuropejskiego w kt\u00f3rej\u00a0by\u0142y przechowywane polskie znaki. By\u0142o&hellip;\n","protected":false},"author":8,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[687,13],"class_list":{"0":"post-694","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-development-design","7":"tag-db","8":"tag-oracle"},"_links":{"self":[{"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/posts\/694","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/comments?post=694"}],"version-history":[{"count":8,"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/posts\/694\/revisions"}],"predecessor-version":[{"id":15634,"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/posts\/694\/revisions\/15634"}],"wp:attachment":[{"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/media?parent=694"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/categories?post=694"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/tags?post=694"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}