Gewusst wie: Senden und Abrufen von ASCII-Daten unter Linux und macOS
In diesem Artikel wird vorausgesetzt, dass die ASCII-Gebietsschemata (nicht UTF-8) auf Ihren Linux- oder macOS-Systemen generiert oder installiert wurden.
So senden Sie ASCII-Zeichensätze an den Server oder rufen dort ab:
Wenn das gewünschte Gebietsschema nicht der Standard in Ihrer Systemumgebung ist, stellen Sie sicher, dass Sie
setlocale(LC_ALL, $locale)
aufrufen, bevor Sie die erste Verbindung herstellen. Die PHP-Funktion setlocale() ändert das Gebietsschema nur für das aktuelle Skript. Wenn sie nach dem Herstellen der ersten Verbindung aufgerufen wird, wird sie möglicherweise ignoriert.Wenn Sie den SQLSRV-Treiber verwenden, können Sie
'CharacterSet' => SQLSRV_ENC_CHAR
als Verbindungsoption angeben, aber dieser Schritt ist optional, da es sich um die Standardcodierung handelt.Bei Verwendung des PDO_SQLSRV-Treibers haben Sie zwei Möglichkeiten. Erstens können Sie beim Herstellen der Verbindung
PDO::SQLSRV_ATTR_ENCODING
aufPDO::SQLSRV_ENCODING_SYSTEM
festlegen (ein Beispiel für das Festlegen einer Verbindungsoption finden Sie unter PDO::__construct). Alternativ können Sie nach erfolgreicher Verbindungsherstellung diese Zeile$conn->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_SYSTEM);
hinzufügen.
Wenn Sie die Codierung einer Verbindungsressource (in SQLSRV) oder eines Verbindungsobjekts (PDO_SQLSRV) angeben, geht der Treiber davon aus, dass für die anderen Verbindungsoptions-Zeichenfolgen dieselbe Codierung verwendet wird. Auch beim Servernamen und den Abfragezeichenfolgen geht er vom selben Zeichensatz aus.
Die Standardcodierung für den PDO_SQLSRV-Treiber ist UTF-8 (PDO::SQLSRV_ENCODING_UTF8), anders als der SQLSRV-Treiber. Weitere Informationen zu diesen Konstanten finden Sie unter Konstanten (Microsoft-Treiber für PHP für SQL Server).
Beispiel
In den folgenden Beispielen wird veranschaulicht, wie ASCII-Daten mithilfe der PHP-Treiber für SQL Server gesendet und abgerufen werden, indem vor dem Herstellen der Verbindung ein bestimmtes Gebietsschema angegeben wird. Die Gebietsschemata auf verschiedenen Linux-Plattformen können anders benannt werden als die gleichen Gebietsschemata in macOS. Beispielsweise ist das Gebietsschema „USA ISO-8859-1 (Lateinisch 1)“ in Linux en_US.ISO-8859-1
, während es in macOS en_US.ISO8859-1
ist.
In den Beispielen wird davon ausgegangen, dass SQL Server auf einem Server installiert ist. Wenn die Beispiele über den Browser ausgeführt werden, werden alle Ausgaben im Browser geschrieben.
<?php
// SQLSRV Example
//
// Setting locale for the script is only necessary if Latin 1 is not the default
// in the environment
$locale = strtoupper(PHP_OS) === 'LINUX' ? 'en_US.ISO-8859-1' : 'en_US.ISO8859-1';
setlocale(LC_ALL, $locale);
$serverName = 'MyServer';
$database = 'Test';
$connectionInfo = array('Database'=>'Test', 'UID'=>$uid, 'PWD'=>$pwd);
$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
echo "Could not connect.<br>";
die(print_r(sqlsrv_errors(), true));
}
// Set up the Transact-SQL query to create a test table
//
$stmt = sqlsrv_query($conn, "CREATE TABLE [Table1] ([c1_int] int, [c2_varchar] varchar(512))");
// Insert data using a parameter array
//
$tsql = "INSERT INTO [Table1] (c1_int, c2_varchar) VALUES (?, ?)";
// Execute the query, $value being some ASCII string
//
$stmt = sqlsrv_query($conn, $tsql, array(1, array($value, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR))));
if ($stmt === false) {
echo "Error in statement execution.<br>";
die(print_r(sqlsrv_errors(), true));
}
else {
echo "The insertion was successfully executed.<br>";
}
// Retrieve the newly inserted data
//
$stmt = sqlsrv_query($conn, "SELECT * FROM Table1");
$outValue = null;
if ($stmt === false) {
echo "Error in statement execution.<br>";
die(print_r(sqlsrv_errors(), true));
}
// Retrieve and display the data
//
if (sqlsrv_fetch($stmt)) {
$outValue = sqlsrv_get_field($stmt, 1, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR));
echo "Value: " . $outValue . "<br>";
if ($value !== $outValue) {
echo "Data retrieved, \'$outValue\', is unexpected!<br>";
}
}
else {
echo "Error in fetching data.<br>";
die(print_r(sqlsrv_errors(), true));
}
// Free statement and connection resources
//
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
<?php
// PDO_SQLSRV Example:
//
// Setting locale for the script is only necessary if Latin 1 is not the default
// in the environment
$locale = strtoupper(PHP_OS) === 'LINUX' ? 'en_US.ISO-8859-1' : 'en_US.ISO8859-1';
setlocale(LC_ALL, $locale);
$serverName = 'MyServer';
$database = 'Test';
try {
$conn = new PDO("sqlsrv:Server=$serverName;Database=$database;", $uid, $pwd);
$conn->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_SYSTEM);
// Set up the Transact-SQL query to create a test table
//
$stmt = $conn->query("CREATE TABLE [Table1] ([c1_int] int, [c2_varchar] varchar(512))");
// Insert data using parameters, $value being some ASCII string
//
$stmt = $conn->prepare("INSERT INTO [Table1] (c1_int, c2_varchar) VALUES (:var1, :var2)");
$stmt->bindValue(1, 1);
$stmt->bindParam(2, $value);
$stmt->execute();
// Retrieve and display the data
//
$stmt = $conn->query("SELECT * FROM [Table1]");
$outValue = null;
if ($row = $stmt->fetch()) {
$outValue = $row[1];
echo "Value: " . $outValue . "<br>";
if ($value !== $outValue) {
echo "Data retrieved, \'$outValue\', is unexpected!<br>";
}
}
} catch (PDOException $e) {
echo $e->getMessage() . "<br>";
} finally {
// Free statement and connection resources
//
unset($stmt);
unset($conn);
}
?>
Weitere Informationen
Abrufen von Daten
Arbeiten mit UTF-8-DatenAktualisieren von Daten (Microsoft-Treiber für PHP für SQL Server)
API-Referenz für den SQLSRV-Treiber
Konstanten (Microsoft-Treiber für PHP für SQL Server)
Beispielanwendung (SQLSRV-Treiber)