IT-Academy Logo
Sign Up Login Help
Home - Programmieren - Datenbanken - Einstieg in MySQL



Einstieg in MySQL

Verwendung von MySQL als Datenbank für C und PHP


Autor: Arnold Willerner (willemer)
Datum: 05-09-2002, 09:14:20
Referenzen: http://www.willemer.de/informatik/
Schwierigkeit: Fortgeschrittene
Ansichten: 8987x
Rating: 4.75 (8x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Einstieg in MySQL

MySQL ist eine sehr beliebte Datenbank, vor allem im Internetbereich. Sie ist durch die offene Struktur von den wichtigen Serversprachen PERL und PHP leicht anspechbar.

Ihr offenkundigster Unterschied zu anderen Systemen ist das Fehlen eines Transaktionsmechanismus (COMMIT, ROLLBACK). Der Hersteller begründet die niedrige Priorität dieses Features für die Weiterentwicklung damit, dass dies erhebliche Auswirkungen auf die Performance habe. Und bei dem typischen Einsatzgebiet als Datenbank für Webserver kann diese Argumentation berechtigt sein.

Initialisierungsarbeiten

MySQL arbeitet über einen TCP/IP-Server namens mysqld auch dann, wenn die Zielmaschine lokal ist. Nach der Installation muss der Server erstmalig gestartet werden. Dies geschieht am einfachsten als root unter Linux. Es ist aber auch möglich, unter einem beliebigen User die Datenbank zu installieren. Zu Beginn muss die Initialisierung der Basisdatenbanken in /var/mysql erfolgen. Dies erreicht der Skript mysql_install_db. Mit safe_mysqld wird der Dämon gestartet. Zum geregelten Herunterfahren des Services dient der dritte Befehl:

mysql_install_db
safe_mysqld &
mysqladmin -u root shutdown

Arbeiten mit MySQL

Zum Arbeiten mit der Datenbank steht neben den Programmierschnittstellen eine Client-Kommandozeile namens mysql zur Verfügung. Hier können SQL-Kommandos abgesetzt werden. Der SQL-Standard braucht hier nicht noch einmal erläutert zu werden, da er an anderer Stelle bereits ausgeführt ist.

Typen

TINYINT 8 Bit
SMALLINT 16 Bit
MEDIUMINT 24 Bit (kein Standard!)
INTEGER oder INT 32 Bit
BIGINT 64 Bit
FLOAT oder FLOAT(4) 4 Byte (max. ca. 10+-38
DOUBLE, REAL oder FLOAT(8) 8 Byte (max. ca. 10+-308
NUMERIC(m,d) oder DECIMAL(m,d) m Byte, sofern m>d, da Stringdarstellung
DATE '1000-01-01' bis '9999-12-31'
DATETIME '1000-01-01 00:00:00' bis '9999-12-31 23:59:59'
TIME '-838:59:59' bis '838:599:59'
CHAR(n) n von 1 bis 255
VARCHAR(n) n von 1 bis 255, nimmt nur soviel Platz wie benötigt ein
TEXT oder BLOB Länge max 216 - 1
MEDIUMTEXT oder MEDIUMBLOB Länge max 224 - 1
LONGTEXT oder LONGBLOB Länge max 232 - 1


Numerische Typen haben optional UNSIGNED. CHAR und VARCHAR können das Attribut BINARY haben. Dies führt dazu, dass eine Sortierung case sensitive ist.

Konstanten

Das Dezimalzeichen ist der Punkt. Strings können durch " und durch ' eingeschlossen werden. Die \-Escapes sind wie die unter C, hinzu kommt \% und \_, da dies ansonsten Wildcards in SQL-Ausdrücken sind.

Weitere Kommandos

CREATE DATABASE Datenbankname
DROP DATABASE Datenbankname
USE DATABASE Datenbankname

Mit CREATE wird eine Datenbank angelegt. In dieser werden die Tabellen erzeugt. Mit DROP wird die Datenbank und alle ihre Tabellen gelöscht. Mit USE wird die Datenbank gewechselt.

OPTIMIZE TABLE Tabellenname


Nach umfangreichem Löschen oder Ersetzen von variablen Feldern kann es sich lohnen, die Tabelle zu optimieren.

MySQL kennt den Befehl REPLACE, der eine Kombination aus DELETE und INSERT auf einer Tabelle mit einem UNIQUE KEY ist.

Import aus Textdateien

LOAD DATA [LOCAL] INFILE 'filename.txt
     INTO TABLE tablename
     [FIELDS [TERMINATED BY '\t'] [OPTIONALLY] ENCLOSED BY " [ESCAPED BY '\\']]
     [LINES TERMINATED BY '\n']
     [(columnname [,columname]*)]


LOCAL bedeutet, dass die Textdatei auf dem Clienthost steht. Fehlt die Angabe, befindet sie sich auf dem Server. Bei letzterem ist der Import natürlich schneller. Man braucht allerdings die entsprechenden Berechtigungen.

Die oben angegebenen Optionen sind der Standard. Ohne Angaben erwartet MySQL also die Felder optionall durch Anführungszeichen begrenzt, aber durch Tabulatorzeichen getrennt und alle Zeilen durch ein Linefeed getrennt.

LOCK und UNLOCK als Alternative zur Transaktion

LOCK TABLES tablename { READ | WRITE }
           [, tablename { READ | WRITE } ]*


READ bedeutet, dass alle Prozesse nur noch auf der Tabelle lesen dürfen. WRITE bedeutet, andere Prozesse dürfen weder Lesen noch Schreiben. Die Sperre wird aufgehoben durch UNLOCK TABLES

Die C-API als Programmierschnittstelle

Für den Zugriff auf die MySQL-Datenbank sind folgende Typen wichtig:
MYSQL Handle zu einer Datenbankverbindung
MYSQL_RES Ein Anfrageresultat, also quasi eine Ergebnistabelle
MYSQL_ROW Ein Ergebniszeile, kann als Array of Strings zugegriffen werden

Ein C-Programm muss zunächst <mysql/mysql.h> einbinden. Beim Übersetzen wird die Library mysqlclient angehängt. Je nach UNIX-Version kann dies das explizite Einbinden der socket erforderlich machen.

/* Demonstration fuer den Zugrff auf MySQL ueber die C-API.
 * (C) Arnold Willemer
 */

#include <mysql/mysql.h>

/* prototypes */
void dbInsert(MYSQL *dbHandle);
void dbSelect(MYSQL *dbHandle);

void main()
{
  MYSQL *     dbHandle;

  dbHandle = mysql_init(0);
  dbHandle = mysql_real_connect(dbHandle,
        "localhost",   /* on what host */
        "arnold",      /* the user */
        0,             /* no password */
        "test_arnold", /* the database */
        0,             /* don't change the port number */
        0,             /* don't change the UNIX socket */
        0);            /* client flag */
  if (dbHandle==0) {
    puts("no connect to database");
    return;
  }

  dbInsert(dbHandle);
  dbSelect(dbHandle);

  /* at last close the connection */
  mysql_close(dbHandle);
}

void dbInsert(MYSQL *dbHandle)
{
  if (0!=mysql_query(dbHandle, 
        "INSERT INTO customer(nr, name) VALUES (12, 'Hans Wurst')")) {
    puts("query INSERT was not successful");
  }
}

void dbSelect(MYSQL *dbHandle)
{
MYSQL_RES * dbResult;
MYSQL_ROW   dbRow;
unsigned long *fieldLengths;
unsigned int i, fieldNumbers;

  if (0!=mysql_query(dbHandle, "SELECT * FROM customer")) {
    puts("query was not successful");
  } else {
    /* now we fetch the results to a local buffer */
    dbResult = mysql_store_result(dbHandle);
    if (dbResult==0) {
      puts(" problem with the result ");
    } else {
      fieldNumbers = mysql_num_fields(dbResult);
      while ((dbRow = mysql_fetch_row(dbResult))) {
        fieldLengths = mysql_fetch_lengths(dbResult);
        for(i = 0; i < fieldNumbers; i++) {
          if (dbRow[i]==0) {
            printf(" (null) ");
          } else {
            printf("%s - ",  dbRow[i] );
          }
        }
        printf("\n");
      }
    }
    mysql_free_result(dbResult);
  }
}


Die Anmeldung und Abmeldung erfolgen mit kurzen klaren Schritten. Es wird der Zielhost, der Benutzer und sein Passwort benötigt. Auch die Datenbank wird angegeben.

Das Einfügen von Daten kann wie alle SQL-Befehle, die keine Antwort brauchen recht einfach bewerkstelligt werden, indem ein String konstruiert wird, der an die Datenbank gesandt wird.

Aufwenig wird es wenn ein SELECT eine Menge von Datensätzn liefert. Dies passt nicht zu den satzorientierten Systemen und Programmiersprachen. Dementsprechend wird hier immer ein recht umständlicher Aufwand betrieben, um dem Mengenparadigma von SQL zu genügen. Im Falle von MySQL wird zunächst ermittelt, Zeile für Zeile geholt und dann spaltenweise ausgewertet.

Datenbankanschluss per PHP

Im Beispiel soll auf eine MySQL-Datenbank zugegriffen werden. Die Aufrufe erinnern ein wenig an die C-API.

int mysql_connect(string [hostname][:port], 
                  string [username], string [password]);
int mysql_close(int [link_identifier] );

Mit mysql_connect wird die Verbindung zur Datenbank aufgebaut. Die Verbindung wird mit mysql_close wieder beendet.

int mysql_db_query(string database, string query, int [link_identifier] );


Mit mysql_db_query kann ein SQL-Kommando an die Datenbank übermittelt werden. Der Rückgabewert ist das Handle auf eine Ergebnismenge, das mit entsprechenden Routinen ausgelesen wird.

array mysql_fetch_row(int result);


Mit mysql_fetch_row wird Zeile für Zeile das Ergebnis in ein Array gelesen, das die Spalten einer Zeile darstellt.

Das folgende Beispiel nimmt eine Verbindung zur lokal eingerichteten Datenbank auf und liest aus der Tabelle customer alle Zeilen und stellt sie im Browser in einer Tabelle dar.

<script language="php">
// Versuche auf die DB zuzugreifen
$dbhandle = mysql_connect("localhost", "arnold");
$dbresult = mysql_db_query("test_arnold", "select * from customer", $dbhandle);
echo "Das ist das Ergebnis:<table border> ";
while ($row = mysql_fetch_row($dbresult)) {
  echo "<tr><td>",$row[0],"</td><td>", $row[1], "</td></tr>";
}
echo "</table>";
mysql_close($dbhandle);
</script>


dreamer
Expert
Beitrag vom:
20-11-2003, 13:16:48

Hier ist anzumerken dass auch ein Passwort angegeben werden muss. mysql_connect("Hostadresse","Username","Passwort")

-----------------------------------------------------


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04510
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06247
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1158
Comments: 0