{"id":23,"date":"2009-02-23T12:47:47","date_gmt":"2009-02-23T10:47:47","guid":{"rendered":"http:\/\/touk.pl\/blog\/?p=23"},"modified":"2023-03-16T15:57:12","modified_gmt":"2023-03-16T14:57:12","slug":"migracja-strony-kodowej","status":"publish","type":"post","link":"https:\/\/touk.pl\/blog\/2009\/02\/23\/migracja-strony-kodowej\/","title":{"rendered":"Migracja strony kodowej"},"content":{"rendered":"<p>Ostatnio wyst\u0105pi\u0142 problem z pewn\u0105 baz\u0105 dewelopersk\u0105, w kt\u00f3rej nie dzia\u0142a\u0142y polskie znaki. Sprawdzi\u0142em parametry bazy poprzez zapytanie<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">select d.parameter Dparameter,\r\n       d.value     Dvalue,\r\n       i.value     Ivalue,\r\n       s.value     Svalue\r\n  from nls_database_parameters d, nls_instance_parameters i,\r\n       nls_session_parameters s\r\n where d.parameter = i.parameter (+)\r\n   and d.parameter = s.parameter (+)\r\norder by 1\r\n<\/pre>\n<p>ze strony: <a class=\"external-link\" href=\"http:\/\/www.databasejournal.com\/features\/oracle\/article.php\/3485216\/The-Globalization-of-Language-in-Oracle---National-Language-Support.htm\" rel=\"nofollow\">http:\/\/www.databasejournal.com\/features\/oracle\/article.php\/3485216\/The-Globalization-of-Language-in-Oracle&#8212;National-Language-Support.htm<\/a><\/p>\n<p>Warto\u015b\u0107 parametru NLS_CHARACTERSET wskaza\u0142a, \u017ce ustawiona jest zachodnioeuropejska strona kodowa WE8ISO8859P1 czyli ISO 8859-1. Konieczne by\u0142o jej zmienienie albo na wschodnioeuropejsk\u0105 EE8ISO8859P2 czyli ISO 8859-2, albo na Unicode&#8217;ow\u0105 AL32UTF8. W celu dokonania migracji skorzysta\u0142em z instrukcji ze strony <a class=\"external-link\" href=\"http:\/\/download.oracle.com\/docs\/cd\/B10500_01\/server.920\/a96529\/ch10.htm\" rel=\"nofollow\">http:\/\/download.oracle.com\/docs\/cd\/B10500_01\/server.920\/a96529\/ch10.htm<\/a><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"oracledb\">SHUTDOWN IMMEDIATE;\r\nSTARTUP MOUNT;\r\nALTER SYSTEM ENABLE RESTRICTED SESSION;\r\nALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;\r\nALTER SYSTEM SET AQ_TM_PROCESSES=0;\r\nALTER DATABASE OPEN;\r\nALTER DATABASE CHARACTER SET AL32UTF8;\r\nSHUTDOWN IMMEDIATE;\r\nSTARTUP;\r\n<\/pre>\n<p>Wszystkie te operacje musia\u0142em robi\u0107 na maszynie, na kt\u00f3rej sta\u0142a baza. SQL*Plusa uruchomi\u0142em komend\u0105<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">sqlplus \/ as sysdba<\/pre>\n<p>Pojawi\u0142y si\u0119 dwa problemy wynik\u0142e z faktu, \u017ce podczas migracji strony kodowej Oracle nie modyfikuje zapisanych danych a jedynie zmienia swoje ustawienia:<\/p>\n<ol>\n<li>Kodowania WE8ISO8859P1 i EE8ISO8859P2 zawsze u\u017cywaj\u0105 jednego bajtu na znak podczas gdy AL32UTF8 u\u017cywa od 1 do 4 bajt\u00f3w. Jednak<br \/>\ndotyczy to tylko typ\u00f3w CHAR i VARCHAR. W przypadku ustawionego kodowania wielobajtowego stosowane jest w CLOBach 2-bajtowe kodowanie. Zmiana<br \/>\nstrony kodowej na AL32UTF8 spowodowa\u0142aby chaos, poniewa\u017c ka\u017cda para znak\u00f3w ISO 8859-1 by\u0142aby traktowana jako jeden znak Unicode. Z tego powodu taka<br \/>\nkonwersja jest niemo\u017cliwa. Jedynym sposobem jest migracja strony kodowej poprzez import i export danych, ale ta droga nie zosta\u0142a<br \/>\nudokumentowana.<\/li>\n<li>Mo\u017cliwe jest tylko zmigrowanie na stron\u0119 kodow\u0105 b\u0119d\u0105c\u0105 \u015bcis\u0142ym nadzbiorem dotychczasowej. Ten warunek oznacza, \u017ce dla ka\u017cdego ci\u0105gu bit\u00f3w dozwolonego w dotychczasowym kodowaniu &#8211; ten ci\u0105g bit\u00f3w mapuje si\u0119 na ten sam znak w nowym kodowaniu. 7-bitowe kodowanie US7ASCII spe\u0142nia ten warunek w stosunku do EE8ISO8859P2 i AL32UTF8, ale WE8ISO8859P1 ju\u017c nie. Na przyk\u0142ad \u00e6 (ae) ma kod E6 w WE8ISO8859P1, ale w AL32UTF8 bajt E6 nie wyst\u0119puje samodzielnie podczas gdy w EE8ISO8859P2 znaku \u00e6 nie ma a bajt E6 to \u0107<br \/>\nNie by\u0142a mo\u017cliwa migracja z WE8ISO8859P1 na EE8ISO8859P2, wi\u0119c zmieni\u0142em jako SYS ustawienia Oracle&#8217;a:<\/li>\n<\/ol>\n<div class=\"code panel\" style=\"border-width: 1px\">\n<div class=\"codeContent panelContent\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"oracledb\">update sys.props$ set VALUE$='US7ASCII' where NAME='NLS_CHARACTERSET'\r\n<\/pre>\n<\/div>\n<\/div>\n<p>Nie polecam tej metody na produkcyjnych bazach, poniewa\u017c zmienianie systemowych ustawie\u0144 bywa niebezpieczne. Mia\u0142em jednak backup bazy, wi\u0119c zaryzykowa\u0142em. Po zmianie warto\u015bci w tabeli komenda<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"oracledb\">ALTER DATABASE CHARACTER SET EE8ISO8859P2;<\/pre>\n<p>przesz\u0142a bez problemu. Je\u015bli by\u0142yby jakie\u015b znaki o kodach powy\u017cej 127 to by\u0142yby one wy\u015bwietlane jako inne w wielu wypadkach znaki, ale nie by\u0142o takich przypadk\u00f3w.<\/p>\n","protected":false},"excerpt":{"rendered":"Ostatnio wyst\u0105pi\u0142 problem z pewn\u0105 baz\u0105 dewelopersk\u0105, w kt\u00f3rej nie dzia\u0142a\u0142y polskie znaki. Sprawdzi\u0142em parametry bazy poprzez zapytanie&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],"_links":{"self":[{"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/posts\/23"}],"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=23"}],"version-history":[{"count":8,"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/posts\/23\/revisions"}],"predecessor-version":[{"id":15295,"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/posts\/23\/revisions\/15295"}],"wp:attachment":[{"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/media?parent=23"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/categories?post=23"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/tags?post=23"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}