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 Frage | Manfred Rebentisch | 14 Aug |