List:German« Previous MessageNext Message »
From:Manfred Rebentisch Date:August 14 2003 4:12pm
Subject:Unicode mit 4.1 und eine Frage
View as plain text  
Ich möchte in vielen Tabellen in verschiedenen Datensätzen unterschiedliche 
Zeichensätze speichern (z.B. in Record 1 Russisch und in Record 2 Hebräisch). 
Ich wollte eine ucs2 (bzw. utf16) Unterstützung, aber diese geht wohl nicht, 
deshalb habe ich es im folgenden mit utf8 probiert. Beim speichern sind aber 
dennoch auch utf16-String verwendbar.

Ich habe unter SuSE Linux 8.2 das Package MySQL-server-4.1.0-0.i386.rpm (und 
die anderen Pakete mit client, devel, shared im Namen) installiert. 
mysqladmin meldet sich:
<code>
ws15:/local/mysql4.1 # /usr/bin/mysqladmin --help
/usr/bin/mysqladmin  Ver 8.40 Distrib 4.1.0-alpha, for pc-linux on i686
Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
</code>
 
In /etc/my.cnf habe ich mit verschiedenen Einstellungen probiert (Ausschnitt):
<code>
[client]
#character-set  = latin1_german1_ci
character-set   = utf8
#default-collation      = latin1_general_ci
# The MySQL server
[mysqld]
default-character-set = utf8
[mysql]
default-character-set-name      = utf8
</code>

Wenn man mysql dann befragt:
<code>
mysql> status
--------------
mysql  Ver 13.5 Distrib 4.1.0-alpha, for pc-linux (i686)

Connection id:          1
Current database:       uctest
Current user:           root@localhost
SSL:                    Not in use
Current pager:          less
Using outfile:          ''
Server version:         4.1.0-alpha-log
Protocol version:       10
Connection:             Localhost via UNIX socket
Client characterset:    latin1_swedish_ci
Server characterset:    utf8
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 5 hours 48 min 31 sec
</code>
sieht man, daß als Client characterset immer latin1_swedish_ci verwendet wird, 
egal was ich in der my.cnf eintrage.

Ich habe eine Tabelle in der Datenbank "uctest" erzeugt:
<code>
mysql> CREATE TABLE ANREDE2(
    -> ANRKEY              int unsigned NOT NULL default '0',
    -> RECHTE              int unsigned NOT NULL default '0',
    -> SICHTBAR            int default '0',
    -> ERFASSTAM           datetime NOT NULL  default '0000-00-00 00:00:00',
    -> TS                  timestamp NOT NULL  default '0000-00-00 00:00:00',
    -> NAME                varchar(80) binary,
    -> PRIMARY KEY (ANRKEY),
    -> KEY Idx_ANREDERECHTE (RECHTE)
    -> ) TYPE=MyISAM COMMENT='Anredeformen' ;
Query OK, 0 rows affected (0.01 sec)
</code>
wobei das Besondere nur der "binary"-Zusatz zum varchar-Feld ist.

Da ich von der mysql-Kommandozeile keine Unicode-Texte eingeben kann, haben 
wir ein Qt-Programm geschrieben, dessen wichtigste Zeilen ich hier mit poste. 
Den mysql-Treiber für Qt 3.1.1 haben wir neu compiliert, damit die 
Bibliotheken von mysql 4.1 verwendet werden. Ohne diesen Schritt funktioniert 
es garnicht. 
<code>
//Unicode - Daten
QString uniString = QChar(0x30f3);
    uniString+=QChar(0x3056);
    uniString+=QChar(0x0141);
    uniString+=QChar(0x0144);
    uniString+=QChar(0x0491);
    uniString+=QChar(0x0492);
    uniString+=QChar(0x0493);
key = 12;
query.prepare( "insert into ANREDE2 (ANRKEY, RECHTE, SICHTBAR, 
	ERFASSTAM, TS, NAME) values (?,0,1,NOW(),NOW(),?)");

query.addBindValue( key );
query.addBindValue( uniString.utf8() );
query.exec();

query.prepare( "insert into ANREDE2 values (13,0,1,NOW(),NOW(),?)");
query.addBindValue( QVariant((const char*)uniString.ucs2()) );
query.exec();

...
    //utf8-String holen:
    QSqlQuery query2( "SELECT * FROM ANREDE2 WHERE ANRKEY=12" );
    while ( query2.next() ) {
        key = query2.value(0).toInt();
        name2 = QString::fromUtf8(query2.value(5).toString().latin1(), -1);
    }
    //utf16-String holen:
    name2 += " // ";
    QSqlQuery query3( "SELECT * FROM ANREDE2 WHERE ANRKEY=13" );
    while ( query3.next() ) {
        key = query3.value(0).toInt();
        name2 += QString::fromUcs2((unsigned short*) 
query3.value(5).toString().latin1() );
    }

    textLabel1->setText(" utf8-form: " + name2);

</code>

Die Programmzeile "query.addBindValue( QVariant((const char*)uniString.ucs2()) 
);" zum Einfügen eines ucs2-Strings ist wohl nicht richtig, funktioniert aber 
in diesem Fall, weil keine Nullbytes enthalten sind.

Hier frage ich mich noch, wie ich eigentlich einen ucs2/utf16-String korrekt 
in ein varchar-Feld speichere, mit und ohne Qt. Aber vielleicht steh ich grad 
auf der Leitung...

Grüße
Manfred

-- 
COMPARAT Software-Entwicklungs-GmbH
Mobile Voice Solutions

Thread
Unicode mit 4.1 und eine FrageManfred Rebentisch14 Aug