[Postfixbuch-users] DB-Queries

Igor Sverkos igor.sverkos at googlemail.com
Fr Mär 16 14:44:43 CET 2012


Hallo,

Stefan G. Weichinger schrieb:
>> Verstanden?
> 
> Ich denke, ja.

Ich denke nicht :)


> Ich denke, das kommt daher, daß ich in der alten MySQL-4.x DB noch
> latin1 hatte. Das wurde dort per automysqlbackup gesichert, und die
> entstandenen SQL-Scripts habe ich genutzt, um am neuen Server die
> Tables/DBs anzulegen.

Verstehe...

1) Stehen in dem Dump CHARSET-Anweisungen? Ein guter Dump enthält bspw.
zu Beginn etwas wie

  /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  /*!40101 SET NAMES latin1 */;
  [...]

damit beim Import nichts kaputt geht (gut, bei Ausgangsdaten latin1 und
Import als UTF-8 kann nichts passieren, da latin1 wie gesagt eine
Untermenge von UTF-8 ist... aber umgekehrt wäre das bspw. fatal).

2) Hast du auch die my.cnf (also Konfigurationsdatei) des Servers
übernommen?


Oder anders gefragt:
Welchen Standard-Zeichensatz verwendet dein Server?

Zeige uns am besten mal ein

  mysql> show variables like 'char%';


> Aber entspricht nicht mein Format der Query (mit dem "latin1"-Zusatz)
> eben genau Deiner Forderung nach "dass dein Connector die Verbindung mit
> dem richtigen Zeichensatz aufbaut" ?
> 
> Das Statement zum Anlegen der Tabelle war übrigens:
> 
> CREATE TABLE `virtual` (
>   `alias` varchar(255) NOT NULL default '',
>   `dest` longtext,
>   `username` varchar(50) NOT NULL default '',
>   `status` int(11) NOT NULL default '1',
>   KEY `alias` (`alias`)
> ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
> 
> Laut Export am alten Server ...

Das ist der Teil weswegen ich glaube, du hast es leider noch nicht
verstanden:

Das CREATE-Statement betrifft nur die Daten, die der mysqld persistieren
soll. D.h. solltest UTF-8 Daten in der Tabelle speichern wollen, wäre
das (nicht) möglich. Sprich wenn du jetzt einen UTF-8 String dem mysqld
übergibst, würde er diesen beim Speichern in latin1 wandeln - dabei
gingen also Daten verloren. Keine tolle Idee.

Wenn du nichts mit UTF-8 Zeichen am Hut hast, ist latin1 völlig in
Ordnung (sogar besser als einfach alles UTF-8 zu machen, Stichwort
Speicher).

Einzig entscheidend ist, dass wenn du dich mit dem mysqld verbindest,
ihm mitteilst in welchem Charset du ihm jetzt Daten übergeben wirst.
Wenn der Server wie gesagt mit dem Standardwert latin1 läuft, wird er
von dir erwarten, auch latin1-kodierte Daten zu erhalten. Übergibst du
ihm aber UTF-8-kodierte Daten, musst du das dem Server eben sagen.
Entweder indem du den Standardwert änderst oder explizit für dieses
Session den "SET CHARACTER"-Befehl absetzt.

Mit "_latin1" castest du. Das Problem dabei ist: Die Übergabe der Daten
erfolgt vorher... dabei würden die Daten verloren gehen.
In deinem Falle wirst du dadurch lediglich "Illegal mix of
collations"-Meldung los, weil du eine Konvertierung erzwingst... aber
siehe oben - wenn wirklich UTf-8 Daten dabei sind, wird das böse Folgen
haben :)

Löse also das Ausgangsproblem gleich und kaschiere nichts.



-- 
Ich Grüße,
Igor



Mehr Informationen über die Mailingliste Postfixbuch-users