zu ändern. setval geht allerdings per default aber beim nächsten Wert los, im Fall “1” (wenn gar keine oder nur negative IDs vorhanden sind) also bei 2. Das ist nicht direkt schlimm, aber uncool. Eine (umständliche!) Lösung ist eine Fallunterscheidung – und falls man die Migration viele viele male durchführen muss, verpackt man die Fallunterscheidung in einer FUNCTION:
FALSE sorgt dafür, dass nicht der nächste Wert genommen wird, sondern genau dieser – und “+ 1” vermeidet einen Wert von 0, der ebenfalls out of bounds wäre.
Danke an Nils für’s vereinfachen! 🙂 Die umständliche Version bleibt trotzdem online als Template für PG Functions.
Es war vor gut zwei Jahren, dass mir das Thema utf8mb4 auffiel. Ein Thema, das auch meinen Hoster uberspace betrifft, denn dort kommt – CentOS 6 sei “Dank” – MySQL 5.1.73 zum Einsatz, und utf8mb4 gibt es erst ab 5.5.3. Was ich leidvoll feststellen musste, als WordPress einen Post nur bis zu einem eingefügten Emoji gespeichert hat, alles darüber hinaus war (stillschweigend!) flöten. Damals wurde ich auf CentOS 7 vertröstet, das das dann können sollte.
Am 16.2. dieses Jahres kam dann der erlösende Blogpost: uberspace unterstützt MariaDB, und zwar in der “zu MySQL 5.5 kompatiblen” Version 10.0 – trotz CentOS 6:
eine Übergangslösung, die nur für Leute gedacht ist, die zwingend hier und jetzt unbedingt MySQL 5.5 bzw. etwas dazu Kompatibles brauchen.
“Hier und jetzt”, eh, ja. In dem Zusammenhang:
Sobald unsere CentOS-7-Hosts am Start sind […]
Dazu gibt es immer noch keinen Zeitplan, Stand 8. April 2016. Aber zurück zum Thema: Das Wiki sagt
Mit dem Befehl uberspace-setup-mariadb kannst du dir eine Datenbank auf dem Host anlegen. Die Zugangsdaten werden in ~/.my.mariadb.cnf abgelegt.
, was bei mir zuerst nicht geklappt hat:
1
2
[crusy@circinus~]$uberspace-setup-mariadb
ERROR2003(HY000):Can't connect to MySQL server on '127.0.0.1'(111)
Nachdem der Support tätig wurde, war der Fehler zwar weg, aber erwähnte .my.mariadb.cnf leer. Inzwischen läuft das aber rund (Danke an den Support an dieser Stelle für die schnelle Reaktion), deshalb hier die vollständige Migration:
// define('DB_HOST', '127.0.0.1:3307'); // NICHT localhost:3307
// define('DB_PASSWORD', 'Passwort aus .my.mariadb.cnf');
// define('DB_CHARSET', 'utf8mb4');
// define('DB_COLLATE', 'utf8mb4_unicode_ci'); // '' scheint auch zu funktionieren
// 5. dump löschen:
[crusy@circinus~]$rm blog.sql
Et voilà: Von 💩 zu 👍 in fünf einfachen Schritten! 😊 Dasselbe jetzt noch für meinen Feedreader! 💪
UPDATE
Meh: Fever “kann” das nicht. Erstens ist utf8 dort hart im Code verdrahtet, zweitens ist bsplw. der Titel eines Eintrags ein varchar(255) – und ein Key:
255 mal 4 Byte (wie in utf8mb4) sind aber mehr als 1000 Byte, und das ist das Limit für einen Schlüssel m( Change Request bei Fever läuft.
Ein Envers Timestamp sieht in der Datenbank bsplw so aus: 1441090155727 (und ist ein Bigint). Das wäre der 30.04.47636, 06:02:07, und ich bezweifel, dass der Datenbankeintrag aus der Zukunft kommt. Die Lösung ist so naheliegend wie einfach: Die letzten drei Stellen stehen für die Millisekunden, der “korrekte” Timestamp lautet 1441090155, und das ist der 01.09.2015, 08:49:15.
Komplette MS SQL-Datenbanken von einem Server auf den anderen zu migrieren, ist nicht so einfach große Scheiße.
Das geht damit los, dass nicht offensichtlich ist, wie man die Daten aus der Datenbank herausbekommt. Es gibt im “Microsoft SQL Server Management Studio” (alleine der Name!):
Rechtsklick -> Tasks -> Daten exportieren (“Export Data”). Hier kann man nur tabellenweise exportieren.
Rechtsklick -> Tasks -> Sichern (“Backup”). Hier wird (trotz “Sicherungstyp: Vollständig”) nur das Schema exportiert.
Rechtsklick -> Tasks -> Skripts generieren (“Generate Scripts”): Erzeugt eine .sql-Datei, die auch nur dann die Daten enthält (und nicht nur das Schema), wenn unter Erweitert -> Datentypen, für die ein Skript erstellt wird (“Types of data to script”) “Schema und Daten” ausgewählt wird.
Es geht damit weiter, dass .sql-Dateien ab einer gewissen Größe nicht vom Management Studio verarbeitet werden können – sie werden exportiert, aber sie werden nicht wieder importiert. Das geht nur (?) über die Konsole:
1
2
// Achtung: Ohne "-o" am Ende:
sqlcmd-S<server>-iC:\<your file here>.sql
Dabei wurde bei mir allerdings die Tabelle dbo.schema_version nicht mit migriert, was Flyway aus dem Konzept bringt. Will man die Tabelle (oder jede andere?) manuell migrieren, muss man darauf achten, welche Sprache eingestellt ist. Kein Witz: Ist der Quell-Server Englisch, der Zielserver aber Deutsch, kann es einen
Meldung 242, Ebene 16, Status 3, Zeile 3
Bei der Konvertierung eines char-Datentyps in einen datetime-Datentyp liegt der datetime-Wert außerhalb des gültigen Bereichs.
(The conversion of a varchar data type to a datetime data type resulted in an out-of-range value) geben. Der Grund: Ein
1
CAST(N'2015-02-17 12:55:56.697'ASDateTime)
ist englische Schreibweise (Monat vor Tag), es muss dann
1
CAST(N'2015-17-02 12:55:56.697'ASDateTime)
heißen… klar: Die Syntax des Skripts ist natürlich abhängig von der Sprache des Clients, nichts liegt näher m(
UPDATE: Unnötig zu sagen, dass der Import per Konsole unendlich lange dauert.