2016-10-04 27 views
0

我不知道我可能會錯過,但目前這一工作的代碼我能夠從db表連接,查詢並返回結果正常。PHP 5.6 - 使用PDO,並指定字符集的Oracle數據庫連接/編碼

但如何能證明從表中以正確的編碼的結果?因爲像ç,á這樣的特殊字符有時會顯示爲問號或方形框。

波紋管,我到目前爲止所有的信息,但我相信定義必須在PDO上設置,因爲如果我只是在頁面上做一個echo "ç -á";,字符將正確顯示。

甲骨文11表字符集:

查詢:SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET' ;

結果:WE8MSWIN1252

php.ini文件編碼設置:

default_charset = "UTF-8" 
internal_encoding = "UTF-8" 
input_encoding = "UTF-8" 
output_encoding = "UTF-8" 

代碼例如:

# 
# PDO Connect example 
# 
$tns   = " 
(DESCRIPTION= 
    (ADDRESS_LIST = 
     (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) 
    ) 
    (CONNECT_DATA= 
     (SID=the_database) 
    ) 
) 
"; 
$username = "x"; 
$password = "x"; 
try { 
    $conn = new PDO("oci:dbname=" . $tns, $username, $password); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} 
catch (PDOException $e) { 
    echo 'ERROR: ' . $e->getMessage(); 
} 

# 
# Fetch results and build html table 
# 
$sql = "select * table"; 

$result = $conn->query($sql); 
echo '<table>'; 
echo '<thead>'; 
echo '<tr>'; 
echo '<th>Info</th>'; 
echo '</tr>'; 
echo '</thead>'; 
echo '<tbody>'; 
foreach ($conn->query($sql) as $row) { 
    echo '<tr>'; 
    echo '<td >' . $row['INFO'] . '</td>'; 
    echo '</tr>'; 
} 
echo '</tbody>'; 
echo '</table>'; 
+0

看起來像你的表字符集是windows 1252(基本上拉丁8859-1);你也需要你的表使用UTF8。 – CD001

+0

@ CD001我相信我需要改變php方面,因爲不允許更改表格的字符集。所以,我會嘗試更新PHP端到拉丁文,看它是否會起作用。我不確定這是否是正確的方向,請您詳細說明,以便我能更好地理解? =) –

+0

這應該工作 - 你非常想在這裏照做:http://stackoverflow.com/questions/279170/utf-8-all-the-way-through/279279 ......但切換一切' ISO-8859-1'(Windows 1252是它的一個子集,所以它應該沒問題)。 – CD001

回答

0

添加:charset=utf8你的DSN字符串的結尾應導致:

  • 數據庫會話使用UTF-8正在創建的會話編碼
  • 的數據存儲爲Windows的1252,基於該NLS WE8MSWIN1252設置
  • Oracle會嘗試將列中的原始Windows-1252值轉換爲您的數據庫會話的UTF-8設置
  • 所請求的等效UTF-8字符串
  • 當且僅當是原始的Windows 1252的原始字節的值精確匹配的有效UTF-8字符(我敢肯定,所有1252個字符具有有效的UTF-8場比賽),那麼返回的值應該是可見你爲UTF-8字符

既然你說的那些特殊字符的原始echo沒有正確顯示在您的瀏覽器,那麼很有可能你的「觀衆」的設置(瀏覽器)是這樣的呼應返回UTF- 8個字符應該成功。