Unicode Kollation

Unicode Kollation

am 23.01.2006 14:34:15 von Oliver Benning

Hallo,

ich habe eine Applikation, die beliebig viele Sprachen unterstützen
soll. In der Datenbank (MySQL 4.1) soll alles im Unicode abgelegt
werden.

Meine Sprachen-Tabelle sieht momentan so aus:

text_id text_lang_id text_value
1 1 Deutscher Text
2 2 English Text

Ich habe in einer Spalte alle Sprachen gemischt, identifizierbar über
die 'text_lang_id'. Geht das in der Form eigentlich mit der Kollation,
oder muß ich für jede Sprache wirklich eine feste Spalte anlegen?

Gruß,
Oliver

Re: Unicode Kollation

am 23.01.2006 16:35:59 von Dominik Echterbruch

Oliver Benning wrote:
>
> ich habe eine Applikation, die beliebig viele Sprachen unterstützen
> soll. In der Datenbank (MySQL 4.1) soll alles im Unicode abgelegt werden.
>
> Meine Sprachen-Tabelle sieht momentan so aus:
>
> text_id text_lang_id text_value
> 1 1 Deutscher Text
> 2 2 English Text
>
> Ich habe in einer Spalte alle Sprachen gemischt, identifizierbar über
> die 'text_lang_id'. Geht das in der Form eigentlich mit der Kollation,
> oder muß ich für jede Sprache wirklich eine feste Spalte anlegen?

Kollation != Sprache. Du hast in der Spalte nur Unicode stehen, als
brauchst du auch nur diese Kollation. Welche Sprache das ist ergibt sich
ja nicht aus den einzelnen verwendeten Zeichen, sondern aus der
Zusammensetzung derselben. Und für die interessiert sich die
Datenbank-Engine IMHO kein Stück :)


Grüße,
Dominik
--
MonstersGame - Die Schlacht zwischen Vampiren und Werwölfen
http://spielwelt6.monstersgame.net/?ac=vid&vid=3018786

Re: Unicode Kollation

am 23.01.2006 16:51:26 von Axel Schwenke

"Oliver Benning" wrote:
>
> ich habe eine Applikation, die beliebig viele Sprachen unterstützen
> soll. In der Datenbank (MySQL 4.1) soll alles im Unicode abgelegt
> werden.
....

> Ich habe in einer Spalte alle Sprachen gemischt, identifizierbar über
> die 'text_lang_id'. Geht das in der Form eigentlich mit der Kollation,

Geht *was* mit *welcher* Collation? Wenn du in einer Spalte mehrere
Sprachen mischst, wirst du vermutlich in deinen SQL-Statements eine
passende Collation angeben wollen (damit String-Vergleiche und
Sortierung "richtig" vorgenommen werden). Du solltest allerdings
beachten, daß die gewählte Default-Collation für deine Spalte einen
eventuell existierenden Index auf diese Spalte beeinflußt.

Dein Tabellen-Layout läßt allerdings vermuten, daß du derartiges
ohnehin nicht vor hast.


XL

Re: Unicode Kollation

am 23.01.2006 18:11:58 von Oliver Benning

Axel Schwenke wrote:
> "Oliver Benning" wrote:
>>
>> ich habe eine Applikation, die beliebig viele Sprachen unterstützen
>> soll. In der Datenbank (MySQL 4.1) soll alles im Unicode abgelegt
>> werden.
> ...
>
>> Ich habe in einer Spalte alle Sprachen gemischt, identifizierbar über
>> die 'text_lang_id'. Geht das in der Form eigentlich mit der
>> Kollation,
>
> Geht *was* mit *welcher* Collation? Wenn du in einer Spalte mehrere
> Sprachen mischst, wirst du vermutlich in deinen SQL-Statements eine
> passende Collation angeben wollen (damit String-Vergleiche und
> Sortierung "richtig" vorgenommen werden). Du solltest allerdings
> beachten, daß die gewählte Default-Collation für deine Spalte einen
> eventuell existierenden Index auf diese Spalte beeinflußt.
> [...]

Mir geht es dabei eigentlich nur um die korrekte Sortierung "WHERE
text_lang_id = x ORDER BY text_value" einer Sprache.

Welche Collation muß ich denn für die text_value Spalte angeben
('utf8_unicode_ci'?) und wie sieht der SELECT aus, wenn ich z.B. nach
griechischer Sprache sortieren will?

Re: Unicode Kollation

am 23.01.2006 19:21:37 von Axel Schwenke

"Oliver Benning" wrote:
> Axel Schwenke wrote:
>>
>> Wenn du in einer Spalte mehrere
>> Sprachen mischst, wirst du vermutlich in deinen SQL-Statements eine
>> passende Collation angeben wollen (damit String-Vergleiche und
>> Sortierung "richtig" vorgenommen werden).
>
> Mir geht es dabei eigentlich nur um die korrekte Sortierung "WHERE
> text_lang_id = x ORDER BY text_value" einer Sprache.

Aha. Also doch.

> Welche Collation muß ich denn für die text_value Spalte angeben
> ('utf8_unicode_ci'?)

Du meinst als Default-Collation? Welche du magst. Wie der Name schon
sagt wird diese Collation verwendet, wenn du keine andere explizit
spezifizierst.

> und wie sieht der SELECT aus, wenn ich z.B. nach
> griechischer Sprache sortieren will?

Du möchtest, daß ich dir
http://dev.mysql.com/doc/refman/5.0/en/charset-collate.html
vorlese? Wohl nicht. Für Griechisch gibt es wohl noch keine Collation.
Vielleicht paßt ja eine der anderen.


XL

Re: Unicode Kollation

am 24.01.2006 02:48:20 von Oliver Benning

Axel Schwenke wrote:
> "Oliver Benning" wrote:

>> und wie sieht der SELECT aus, wenn ich z.B. nach
>> griechischer Sprache sortieren will?
>
> Du möchtest, daß ich dir
> http://dev.mysql.com/doc/refman/5.0/en/charset-collate.html
> vorlese? Wohl nicht. Für Griechisch gibt es wohl noch keine Collation.
> Vielleicht paßt ja eine der anderen.

SHOW COLLATION; liefert mir u.a.:

greek_general_ci

Wenn ich UTF8 in der Applikation verwende und die Daten auch als UTF8 in
die Datenbank speichere, kann ich dann überhaupt eine Collation wie
greek_general_ci oder latin_german2_ci verwenden, oder muß es eine
utf8_xyz_ci sein?

Oder ist es eher üblich, in der Applikation von UTF8 in das
entsprechende Charset (z.B. Latin1) zu konvertieren und die Daten dann
erst in die Datenbank zu schreiben? Falls ja, kann MySQL 4.1 das
automatisch?

Re: Unicode Kollation

am 24.01.2006 13:37:59 von Axel Schwenke

"Oliver Benning" wrote:
> Axel Schwenke wrote:
>> "Oliver Benning" wrote:
>
>>> und wie sieht der SELECT aus, wenn ich z.B. nach
>>> griechischer Sprache sortieren will?
>>
>> Du möchtest, daß ich dir
>> http://dev.mysql.com/doc/refman/5.0/en/charset-collate.html
>> vorlese? Wohl nicht. Für Griechisch gibt es wohl noch keine Collation.
>> Vielleicht paßt ja eine der anderen.
>
> SHOW COLLATION; liefert mir u.a.:
>
> greek_general_ci

Die ist aber für Charset=greek und nicht für utf8.

> Wenn ich UTF8 in der Applikation verwende und die Daten auch als UTF8 in
> die Datenbank speichere, kann ich dann überhaupt eine Collation wie
> greek_general_ci oder latin_german2_ci verwenden, oder muß es eine
> utf8_xyz_ci sein?

Eben.

> Oder ist es eher üblich, in der Applikation von UTF8 in das
> entsprechende Charset (z.B. Latin1) zu konvertieren und die Daten dann
> erst in die Datenbank zu schreiben? Falls ja, kann MySQL 4.1 das
> automatisch?

Zeichensatzkonvertierung zwischen Datenbank und Applikation ist nicht
ungewöhnlich. MySQL kann das auch automatisch (charset_connection,
charset_result). Allerdings kann man so nicht Texte in verschiedenen
Sprachen in einer Spalte unterbringen. Dafür nimmt man utf8 und
idealerweise eine passende utf8-Collation. Daß es kein utf8_greek_*
gibt, kann auch bedeuten, daß utf8_general_* funktioniert.
Ich verstehe bei Griechisch immer nur Spanisch ;-) kann das also nicht
beurteilen.


XL

Re: Unicode Kollation

am 25.01.2006 03:00:09 von Oliver Benning

Axel Schwenke wrote:
> [...]
> Zeichensatzkonvertierung zwischen Datenbank und Applikation ist nicht
> ungewöhnlich. MySQL kann das auch automatisch (charset_connection,
> charset_result). Allerdings kann man so nicht Texte in verschiedenen
> Sprachen in einer Spalte unterbringen. Dafür nimmt man utf8 und
> idealerweise eine passende utf8-Collation.

Und wenn ich die Konvertierung auf Seiten der Applikation durchführe,
gibt es dann noch Bedenken, in meiner Einspalten-Variante mehrere
Nicht-UTF8-Charsets zu mischen und dann die jeweils passende Kollation
beim SELECT anzugeben?

> Daß es kein utf8_greek_* gibt, kann auch bedeuten, daß utf8_general_*
> funktioniert.
> Ich verstehe bei Griechisch immer nur Spanisch ;-) kann das also nicht
> beurteilen.

Weiss hier sonst jemand, wie man Griechisch korrekt behandelt?

Re: Unicode Kollation

am 25.01.2006 09:15:23 von Axel Schwenke

"Oliver Benning" wrote:
> Axel Schwenke wrote:
>> [...]
>> Zeichensatzkonvertierung zwischen Datenbank und Applikation ist nicht
>> ungewöhnlich. MySQL kann das auch automatisch (charset_connection,
>> charset_result). Allerdings kann man so nicht Texte in verschiedenen
>> Sprachen in einer Spalte unterbringen. Dafür nimmt man utf8 und
>> idealerweise eine passende utf8-Collation.
>
> Und wenn ich die Konvertierung auf Seiten der Applikation durchführe,
> gibt es dann noch Bedenken, in meiner Einspalten-Variante mehrere
> Nicht-UTF8-Charsets zu mischen und dann die jeweils passende Kollation
> beim SELECT anzugeben?

Jein. Es geht nicht ganz so einfach. Collations sind an Zeichensätze
gebunden. Vermutlich (nicht getestet) kann man es so machen:

Spalte: CHARSET utf8 COLLATION utf8_bin
Query: SELECT ... _greek textspalte COLLATE greek_general_ci

Allerdings wird das langsam für große Resultsets und/oder wenn man
eigentlich gerne einen Index auf `textspalte` verwenden möchte.

> Weiss hier sonst jemand, wie man Griechisch korrekt behandelt?

Frag mal auf http://forums.mysql.com/list.php?103


XL