Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

odbc.ini und Zeichensatz

13 views
Skip to first unread message

Volker Englisch

unread,
May 27, 2023, 9:57:10 AM5/27/23
to
Hallo!

Auf einem Datenbankserver (PostgreSQL) werden die Datensätze in Latin1
gespeichert.

Auf Windows-Clients funktioniert der Zugriff mit dem ANSI-ODBC-Treiber
einwandfrei.

Leider nicht auf Linux-Clients (UTF-8 Zeichensatz). Dort werden Umlaute
"geschrottet" angezeigt. Meine aktuelle .odbc.ini sieht so aus (Ausschnitt):

[Media]
Driver = /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
Servername = xxxxxxxx
Username = xxxxxxxx
Password = xxxxxxxx
Database = media
Port = 5432
client charset = UTF-8
server charset = Latin1

Ich habe schon alle möglichen Einträge probiert, die ich im Netz
gefunden habe, aber ohne Erfolg.

Was muss in die .odbc.ini korrekterweise rein...?

Peter J. Holzer

unread,
May 27, 2023, 4:41:38 PM5/27/23
to
On 2023-05-27 13:50, Volker Englisch <v...@krrz.de> wrote:
> Auf einem Datenbankserver (PostgreSQL) werden die Datensätze in Latin1
> gespeichert.

Ich will jetzt nicht wissen, wieso.


> Auf Windows-Clients funktioniert der Zugriff mit dem ANSI-ODBC-Treiber
> einwandfrei.
>
> Leider nicht auf Linux-Clients (UTF-8 Zeichensatz). Dort werden Umlaute
> "geschrottet" angezeigt.

Das kann natürlich auch an der Anzeige liegen.

> Meine aktuelle .odbc.ini sieht so aus (Ausschnitt):
>
> [Media]
> Driver = /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
> Servername = xxxxxxxx
> Username = xxxxxxxx
> Password = xxxxxxxx
> Database = media
> Port = 5432
> client charset = UTF-8
> server charset = Latin1
>
> Ich habe schon alle möglichen Einträge probiert, die ich im Netz
> gefunden habe, aber ohne Erfolg.
>
> Was muss in die .odbc.ini korrekterweise rein...?

Mit ODBC kann ich Dir nicht helfen (habe ich unter Linux/Unix nie
verwendet, da gibt es eigentlich immer ein naheliegenderes System), aber
mit psql kann ich auf eine Datenbank mit Latin9 zugreifen:

postgres=# create database isotest encoding iso885915 lc_ctype='en_US.iso885915' lc_collate='en_US.iso885915' template=template0;
CREATE DATABASE


isotest=> create table t(id serial primary key, t text);
CREATE TABLE

isotest=> show server_encoding ;
╔═════════════════╗
║ server_encoding ║
╟─────────────────╢
║ LATIN9 ║
╚═════════════════╝
(1 row)

isotest=> show client_encoding ;
╔═════════════════╗
║ client_encoding ║
╟─────────────────╢
║ UTF8 ║
╚═════════════════╝
(1 row)

isotest=> insert into t(t) values('Käse');
INSERT 0 1

isotest=> insert into t(t) values('100 €');
INSERT 0 1

isotest=> insert into t(t) values('メギツネ');
ERROR: character with byte sequence 0xe3 0x83 0xa1 in encoding "UTF8" has no equivalent in encoding "LATIN9"

isotest=> select * from t;
╔════╤═══════╗
║ id │ t ║
╟────┼───────╢
║ 1 │ Käse ║
║ 2 │ 100 € ║
╚════╧═══════╝
(2 rows)

Die Daten sind auch wirklich in ISO-8859-15 gespeichert:

# od -c 246140
0000000 320 \0 \0 \0 270 353 002 T \0 \0 \0 \0 \0 260 037
0000020 \0 004 \0 \0 \0 \0 330 237 B \0 260 237 D \0
0000040 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
*
0017660 335 325 \v \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0017700 002 \0 002 \0 002 \t 030 \0 002 \0 \0 \0 \r 1 0 0
^^^ ^^^ ^^^
0017720 244 \0 \0 \0 \0 \0 \0 334 325 \v \0 \0 \0 \0 \0
^^^ ^^^
0017740 \0 \0 \0 \0 \0 \0 \0 \0 001 \0 002 \0 002 \t 030 \0
0017760 001 \0 \0 \0 \v K 344 s e \0 \0 \0 \0 \0 \0 \0
^^^ ^^^ ^^^ ^^^
0020000

hp

Volker Englisch

unread,
May 28, 2023, 10:37:08 AM5/28/23
to
Am 27.05.23 um 22:39 schrieb Peter J. Holzer:
> On 2023-05-27 13:50, Volker Englisch <v...@krrz.de> wrote:
>> Auf einem Datenbankserver (PostgreSQL) werden die Datensätze in Latin1
>> gespeichert.
>
> Ich will jetzt nicht wissen, wieso.

Ja mei...

>> Auf Windows-Clients funktioniert der Zugriff mit dem ANSI-ODBC-Treiber
>> einwandfrei.
>>
>> Leider nicht auf Linux-Clients (UTF-8 Zeichensatz). Dort werden Umlaute
>> "geschrottet" angezeigt.
>
> Mit ODBC kann ich Dir nicht helfen (habe ich unter Linux/Unix nie
> verwendet, da gibt es eigentlich immer ein naheliegenderes System), aber
> mit psql kann ich auf eine Datenbank mit Latin9 zugreifen:
> isotest=> show client_encoding ;
> ╔═════════════════╗
> ║ client_encoding ║
> ╟─────────────────╢
> ║ UTF8 ║
> ╚═════════════════╝
> (1 row)

Du hast mir doch geholfen, danke. Zum einen bei der Erkenntnis, dass für
das Encoding "UTF8" und nicht "UTF-8" stehen muß. Zum anderen hat mir
genau das bei der Suche geholfen. Der richtige Eintrag in der .odbc.ini
lautet:

ConnSettings = SET CLIENT_ENCODING TO 'UTF8'

Und damit funktionierts.

V.
0 new messages