All posts tagged “SQL”

Neue Versionen von MySQL released

Für die freue Datenbank MySQL wurden heute 3 neue Versionen (5.1.11, 5.0.22 und 4.1.20) veröffentlicht. Neben diversen Fehlern wurde auch Schwachstelle in der Funktion mysql_real_escape_string() beseitigt, über die SQL-Injection möglich waren.

mysql_real_escape_string() sollte eigentlich gerade diese Injections verhindern, unter bestimmten Umständen war dieses aber dennoch möglich. Anwendern, welche die neue Version nicht installieren können, empfehlen die Entwickler die Datenbank im SQL-Mode NO_BACKSLASH_ESCAPES SQL zu betreiben.

Mehr Infos zu den neuen Versionen gibt es in den entsprechenden Changelogs:

Ip2Nation – the c# way

Eine IP-Adressen einem Land programmatisch zuzuweisen ist eigentlich nicht schwer. Im Netz finden sich einige freie Datenbanken, aus denen man die notwendigen Informationen abgreifen kann. Auf www.ip2nation.com findet man z.B. einen MySQL Dump sowie diverse Beispielscripte, um eine Abfrage dieser Art in PHP zu bauen.

Mehr oder weniger problematisch wird das ganze allerdings, wenn man versucht eines der Beispiele von ip2nation für C#.NET umzubauen. Zwar lassen sich die etsprechenden Tabelle und Inhalte recht einfach auch in einen MS SQL Server importieren (lediglich der Datentyp der Spalte ip in der Tabelle ip2nation muß in den Datentyp bigint geändert werden). T-SQL verfügt allerdings nicht über eine INET_ATON-Funktion, wie man sie z.B. von MySQL kennt.

Kurz zum Verständnis: INET_ATON ist eine MySQL Funktion, die eine Ganzzahl zurück gibt, welche den numerischen Wert einer Netzwerk-Adresse darstellt.

Für C# benötigen wir daher zunächst mal ein entsprechendes Äquvalent für die INET_ATON Funktion:

private double DotNetINET_ATON(string RealIP)
{
        int x;
        string [] arrIPSplit;
        double num = 0;
        if RealIP == "")
        {
                return 0;
        }
        else
        {
                arrIPSplit = RealIP.Split(‘.’);
                for(x = arrIPSplit.Length - 1; x >= 0 ; x )
                {
                        num += ((int.Parse(arrIPSplit[x])%256) * Math.Pow(256 ,(3 - x )));
                }
                return num;
        }
}

Das SQL Statement kann dann auch schon fast so bleiben wie es im Beispiele von ip2nation angezeigt wird, lediglich das “LIMIT 0,1″ sollte man gegen ein TOP 1 austauschen, da MS SQL diesen Befehl nicht kennt. Im Rahmen einer Stored Procedure würde das Ganze dann etwa so aussehen:

ALTER  PROCEDURE GetNation
(
        @ip bigint = NULL
)
AS

SELECT  TOP 1
        c.country
FROM
        ip2nationCountries c,
        ip2nation i
WHERE
        i.ip < @ip
AND
        c.code = i.country
ORDER BY
        i.ip DESC

Und das war´s eigentlich auch schon. Nun sollte ein einfacher Aufruf DotNetINET_ATON(ip) den numerischen Wert einer Netzwerk-Adresse zurückgeben, die man dann auf die Datenbank bzw. Stored Procedure jagen kann.

Ob der Code richtig arbeitet, kann man übrigends leicht durch die IP 127.0.0.1 feststellen. Hier sollte DotNetINET_ATON als Return-Wert 2130706433 zurückgeben.

Joomla und MySQL 5

Leider ist für das CMS Joomla eine funktionierende Version, die unter der neuen MySQL Version 5 läuft noch nicht erschienen. Laut Roadmap ist dieses auch nicht vor der Version 1.1 geplant.

Seit der Joomla Version 1.0.7 liegt aber im Ordner “includes” die Datei database.mysql5.php, die zumindest einen Prototype-Treiber für MySQL 5 darstellen soll. Leider funktioniert diese Version sowie alle anderen im Joomla.org-Forum erhältlichen nicht einwandfrei. Tauscht man die File wie angegeben gegen die Datei database.php aus, versagt Joomla seinen Dienst und man erhält beim aufrufen der URL nur eine weisse Seite.

Stellt man per php.ini oder .htaccess das Error-Handling von PHP an, bekommt man zumindest ansatzweise eine Information, wieso das CMS nicht funktioniert:

Fatal error: Call to undefined method mosSession::_setSchema() in database.php on line 757

Wie es ausshieht, hat sich in der Joomla-Community bislang über diesen Fehler noch niemand Gedanken gemacht, geschweige denn eine Lösung eroiert. Stattdessen wird zum Downgrade geraten. Zugegeben, eine Lösung, die vielleicht für Leute mit einem eigenen Server interessant ist, setzt aber der Hosting-Provider MySQL 5 ein, wird es kompliziert, zumal die Lösung des Problems sehr einfach ist … zumindest auf den ersten Blick!

Debuggt man das Joomla-System einwenig und schaut sich den entsprechenden Code der Datei database.mysql5.php etwas näher an, so fällt einem folgendes auf:

In der abstracten Classe mosDBTable gibt es die private member Funktion &_getSchema(), die auch anstandslos aufgerufen wird. Dort wird die ebenfalls als privat member declarierte setSchema() aufgerufen, die aber nicht als solche geschrieben ist (ca. Zeile 760). Korregiert man die Schreibweise, also schreibt &_setSchema() anstatt setSchema(), läuft Joomla auch mit MySQL 5 anstandslos.

.. zumindest auf den ersten Blick. Ob auch alle Module (vorallem 3rd party) laufen, kann ich bis dato nicht sagen. Zumindest das Module SimpleFAQ 2.11 scheint mit dem oben genannten WorkAround nicht zu funktionieren.

Kalenderwochen und SQL

Der SQL Server von Microsoft scheint Kalenderwochen nicht nach DIN 1355 zu berechnen. Gibt man im Query-Analyser

select DATEPART ( week , getdate() )

am heutigen Datum (21.12.2005) ein, bekommt man als Antwort die 52. Kalenderwoche. Laut DIN 1355 müßte das aber die 51. sein.

Leider gibt es zumindest auf Seiten des SQL-Servers keinen Workaround für das Problem, also muss man es halt programmatisch lösen:

DateTime dt = DateTime.Now; System.Globalization.Calendar calender = CultureInfo.CurrentCulture.Calendar; int weekofyear = calender.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

Dann stimmt´s auch wieder mit mit den Wochen ;)

Update
Es geht sogar mit SQL .. was ich um einiges eleganter finde ;)

set @date = getdate() select @ISOweek = datepart(wk,@date)+1-datepart(wk,’Jan 04,’+CAST(datepart(yy,@date) as CHAR(4))) if (@ISOweek=0) select @ISOweek=datepart(wk, ‘Dec ‘+ CAST(24+datepart(day,@date) as CHAR(2))+’,’+CAST(datepart(yy,@date)-1 as CHAR(4)))+1

PostgreSQL meets MySQL

Um PostgreSQL nun auch MySQL-Usern schmackhaft zu machen, entwickelt Chris Kings-Lynne die Bibliothek MySQL Compat, welche Funktionen, Aggregate, Operatoren und Umwandlungen von MySQL für ProstgreSQL kompatibel machen soll.

Laut Kings-Lynne stehen rund 100 dieser MySQL-Funktionen im Visier der Entwickler. Durch diese Implementierung sollen Applikationen die nur MySQL unterstützen nun auch PostgreSQL nutzen können.

Nun ja, über denn Sinn und Zweck dieser Bibliothek läßt sich streiten, zumal, das sagt selbst Kings-Lynne, PostgreSQL und MySQL in einigen Punkten zu unterschiedlich sind, was eine Reimplementierung aller Funktionen unmöglich macht. Als Entwickler würde ich auf jeden Fall eine vernüftig gestrickte Datenbankabstraktionsschicht einem solchen Konstrukt vorziehen.

[via newsforge.com]

Tabellenwahnsinn

Dazu fällt mir nix mehr ein .. aua …

[via rfc1437.de]

SERVERPROPERTY

Manchmal findet man in der SQL-Server Doku von Microsoft Sachen, die man doch noch nicht kennt. So bin ich gestern über den Befehl SERVERPROPERTY gestolpert. Mit diesem kann man Eigenschaftsinformationen über die Serverinstanz zurückgeben.

Die Anfrage

SELECT SERVERPROPERTY(‘productversion’) as Version, SERVERPROPERTY (‘productlevel’) As ServicePack, SERVERPROPERTY (‘edition’) as Edition, SERVERPROPERTY (‘MachineName’) AS MachineName

würde z.B. die Versionsnummer des SQL Servers, das installierte ServicePack sowie die Edition (also z.B. ‘Developer Edition’, ‘Enterprise Edition’ etc…) und den Name des Computers unter Windows NT, auf dem die Serverinstanz ausgeführt wird ausgeben.

Man lernt halt nie aus … :)

Neue PostgreSQL Beta released

Für die kommende Version 8.1 der freien PostgreSQL-Datenbank wurde eine neue Beta-Version veröffentlicht.

Neben mehr Geschindigkeit bietet die neue Version unter anderem eine überholte Benutzerverwaltung und Rollen als Autorisierungsmodell. Ferner kann die neue Version nun auch innerhalb einer Abfrage mehrere Indizes beim Zugriff auf eine Tabelle nutzen und Transaktionen auf mehreren Sytemen vorbereiten und anschließend gemeinsam auf einem System ausführen.

Die Beta Version steht als SourceCode auf der PostgreSQL Site als Download zur Verfügung.

MySQL 5 ist da

fp-mysql-5-is-here-b_t.gifDie freie Datenbank MySQL wurde von seinem gleichnamige Hersteller heute in der Version 5.0.15 für den produktiven Einsatz offiziell freigegeben.

Wiederholt hat MySQL darauf hingewiesen, dass MySQL 5 das bedeutendste Upgrade in der zehnjährigen Firmengeschichte darstellt. Die neue Version unterstützt unter anderem "Stored Procedures", Trigger, Views, Cursor und komplexe Transaktionen über mehrere Datenbanken hinweg.

Die Binaris für Windows, Solaris, MacOS X, FreeBSD, Linux und einer Reihe weitere Betriebssysteme stehen wie immer auf diversen Mirrors als Download zur Verfügung.

Das MySQL 5 aber auch schon vor dem heutigen Datum als RC sehr stabil lief/läuft haben diverse Seiten (unter anderem auch dieses Blog *sfg*) schon unter Beweis gestellt.

[via mysql.com]

Access nach MySQL konvertieren

Will man eine Access MDB nach MySQL exportieren gibt es viele Wege wie z.B. CVS usw. Eine Recht kompfortable Lösung habe ich nun auf freeaccess.de gefunden. In der dort verfügbaren KnowHow.mdb V3.0 von Klaus Oberdalhoff ist ein VB-Script für diesen Export vorhanden. Dieses Script erstellt aber nicht nur ein SQL-Script für den Import der Daten in die MySQL-DB, sondern es erzeugt ebenfalls die nötigen CREATE TABLE – Tags zum Erstellen der Tabellen.

Zwar muss man anschließend noch etwas Hand anlegen (zumindest fehlten bei mir einige Primärschlüssel), aber eine Arbeitserleichterung ist es auf jeden Fall.