如何:傳送及擷取 Linux 與 macOS 中的 ASCII 資料
此文章假設您的 Linux 或 macOS 系統中已產生或安裝 ASCII (非 UTF-8) 地區設定。
將 ASCII 字元集傳送或擷取到伺服器:
若想要的地區設定不是您系統環境中的預設值,請務必在第一次連線之前先叫用
setlocale(LC_ALL, $locale)
。 PHP setlocale() 函式只會變更目前指令碼的地區設定,而且若在進行第一次連線之後叫用,則系統可能會將其忽略。使用 SQLSRV 驅動程式時,您可以指定
'CharacterSet' => SQLSRV_ENC_CHAR
作為連線選項,但此步驟是選擇性的,因為它是預設的編碼。使用 PDO_SQLSRV 驅動程式時,有兩種方式。 首先,在進行連線時,將
PDO::SQLSRV_ATTR_ENCODING
設定為PDO::SQLSRV_ENCODING_SYSTEM
(如需設定連線選項的範例,請參閱 PDO::__construct)。 或者,在成功連線之後,新增這一行$conn->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_SYSTEM);
當您指定連線資源 (在 SQLSRV 中) 或連線物件 (PDO_SQLSRV) 的編碼方式時,驅動程式會假設其他連線選項字串使用該相同編碼。 此外也會假設伺服器名稱和查詢字串使用相同的字元集。
PDO_SQLSRV 驅動程式的預設編碼為 UTF-8 (PDO::SQLSRV_ENCODING_UTF8),與 SQLSRV 驅動程式不同。 如需這些常數的詳細資訊,請參閱常數 (適用於 SQL Server 之 PHP 的 Microsoft 驅動程式)。
範例
下列範例示範如何在進行連線之前指定特定地區設定,以使用適用於 SQL Server 的 PHP 驅動程式來傳送及擷取 ASCII 資料。 不同 Linux 平台的地區設定命名方式可能會與 macOS 中相同地區設定的命名方式不同。 例如,US ISO-8859-1 (Latin 1) 地區設定在 Linux 中是 en_US.ISO-8859-1
,而在 macOS 中,該名稱是 en_US.ISO8859-1
。
這些範例假設伺服器上已安裝 SQL Server。 從瀏覽器執行範例時,所有輸出都會寫入至瀏覽器。
<?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);
}
?>
另請參閱
擷取資料
處理 UTF-8 資料更新資料 (適用於 SQL Server 之 PHP 的 Microsoft 驅動程式)
SQLSRV 驅動程式 API 參考
常數 (Microsoft Drivers for PHP for SQL Server)
範例應用程式 (SQLSRV 驅動程式)