Обсуждение: Can I change the character encoding for a DB?

Поиск
Список
Период
Сортировка

Can I change the character encoding for a DB?

От
"Iain"
Дата:
Hi All,
 
I created a DB with SQL_ASCII encoding but I want to change it to EUC_JP. Can I do this without creating a new database? I didn't find a way in the docs, sorry.
 
  set server_encoding = EUC_JP;
 
didn't work.
 
My understanding is that the encoding is purely information and doesn't actually affect the data stored in the DB. Is that right?
 
The reason I want to do this is that my java app is corrupting Japanese Kanji. I suspect that the JDBC driver uses this information. VB apps using ODBS seem to be fine.

Re: Can I change the character encoding for a DB?

От
Tom Lane
Дата:
"Iain" <iain@mst.co.jp> writes:
> I created a DB with SQL_ASCII encoding but I want to change it to EUC_JP.
> Can I do this without creating a new database?

If you're certain that the data already in the database is in EUC_JP
encoding, it would probably work to do a quick UPDATE on the
pg_database.encoding entry for the database (and then start fresh
backend sessions, since they won't notice otherwise).  If there's data in
there that is not correct per EUC_JP then this will create big problems,
so don't say I didn't warn you ...

            regards, tom lane

Re: Can I change the character encoding for a DB?

От
"Iain"
Дата:
Hi Tom,

Thanks for the info and warning. Fortunately this is just a development
database so any problems won't be too big a deal.

Does dumping and re-creating the DB avoid such a potential problem?

I read the info written by Tasuo, but I have to admit that the whole
encoding thing is still full of mystery for me. For example, if the database
has a SQL_ASCII encoding and you enter japanese text, what encoding is used?
Does it depend on the client used to enter it? I wonder if it is possible
that there is some SJIS data in my DB... My understanding is that the DB
doesn't ensure that data makes sense in the set encoding, it just allows the
db to make conversions when dealing with clients such as the ODBC and JDBC
drivers.

Anyway, in this case the base data came from a EUC_JP encoded DB, but a VB
app (and some psql scripts) has been used to enter and modify data. It uses
the ODBC driver provided for postgres, everything had been working smoothly
and I only noticed a problem when I tried getting data using java and the
jdbc driver. I created a new mini test DB with the EUC_JP encoding and the
data was returned correctly.

regards,
 Iain


----- Original Message -----
From: "Tom Lane" <tgl@sss.pgh.pa.us>
To: "Iain" <iain@mst.co.jp>
Cc: <pgsql-admin@postgresql.org>
Sent: Tuesday, January 27, 2004 2:05 AM
Subject: Re: [ADMIN] Can I change the character encoding for a DB?


> "Iain" <iain@mst.co.jp> writes:
> > I created a DB with SQL_ASCII encoding but I want to change it to
EUC_JP.
> > Can I do this without creating a new database?
>
> If you're certain that the data already in the database is in EUC_JP
> encoding, it would probably work to do a quick UPDATE on the
> pg_database.encoding entry for the database (and then start fresh
> backend sessions, since they won't notice otherwise).  If there's data in
> there that is not correct per EUC_JP then this will create big problems,
> so don't say I didn't warn you ...
>
> regards, tom lane


Re: Can I change the character encoding for a DB?

От
Tom Lane
Дата:
"Iain" <iain@mst.co.jp> writes:
> I read the info written by Tasuo, but I have to admit that the whole
> encoding thing is still full of mystery for me. For example, if the database
> has a SQL_ASCII encoding and you enter japanese text, what encoding is used?
> Does it depend on the client used to enter it?

I'm not an expert on this stuff, but my understanding is that setting
the encoding to SQL_ASCII disables all encoding-conversion logic ---
whatever bytes the client sends are what get stored.  So if you want
to change the setting from SQL_ASCII to something else, you'd better be
sure that everything every client has stored is compatible with the new
encoding specification.

> My understanding is that the DB
> doesn't ensure that data makes sense in the set encoding,

When you select a real encoding spec (not SQL_ASCII) then the DB does
check that entered strings are valid in that encoding.  Also it will
attempt to do encoding conversion, if clients specify they are using
a client_encoding that is different from the database encoding (and
is not SQL_ASCII).

Hope that helps --- if not, try Tatsuo ...

            regards, tom lane

Re: Can I change the character encoding for a DB?

От
"Iain"
Дата:
Hi Tom,

Thanks for that. It's somewhat clearer now.

I went ahead and rebuilt the DB with no problems so I guess that whatever
data was in the DB converted OK.

Regards
Iain

> "Iain" <iain@mst.co.jp> writes:
> > I read the info written by Tasuo, but I have to admit that the whole
> > encoding thing is still full of mystery for me. For example, if the
database
> > has a SQL_ASCII encoding and you enter japanese text, what encoding is
used?
> > Does it depend on the client used to enter it?
>
> I'm not an expert on this stuff, but my understanding is that setting
> the encoding to SQL_ASCII disables all encoding-conversion logic ---
> whatever bytes the client sends are what get stored.  So if you want
> to change the setting from SQL_ASCII to something else, you'd better be
> sure that everything every client has stored is compatible with the new
> encoding specification.
>
> > My understanding is that the DB
> > doesn't ensure that data makes sense in the set encoding,
>
> When you select a real encoding spec (not SQL_ASCII) then the DB does
> check that entered strings are valid in that encoding.  Also it will
> attempt to do encoding conversion, if clients specify they are using
> a client_encoding that is different from the database encoding (and
> is not SQL_ASCII).
>
> Hope that helps --- if not, try Tatsuo ...
>
> regards, tom lane