簡體   English   中英

PDO + MySQL 和損壞的 UTF-8 編碼

[英]PDO + MySQL and broken UTF-8 encoding

I use the PDO library with a MySQL database in PHP, but if I insert any data encoded in UTF-8, like Arabic words, it's inserted into the database, but as ????????? .

在我自己的框架中,創建 PDO 連接后,我發送了兩個查詢 - SET NAMES utf8SET CHARACTER SET utf8 它仍然不起作用。

例子:

loadclass('PDO', array(
    sprintf(
        'mysql:host=%s;port=%s;dbname=%s',
        confitem('database', 'host'),
        confitem('database', 'port'),
        confitem('database', 'name')
    ),
    confitem('database', 'username'),
    confitem('database', 'password'),
    array('PDO::ATTR_PERSISTENT' => confitem('database', 'pconnect'))
));
$this->query('SET NAMES ' . confitem('database', 'charset'));
$this->query('SET CHARACTER SET ' . confitem('database', 'charset'));

解決方法:在插入數據庫之前使用json_encode function 轉換數據,獲取后使用json_decode解碼。 這就是我現在的做法。

警告:此答案適用於 PHP 5.3.5 及更低版本。 不要將它用於 PHP 5.3.6 版(2011 年 3 月發布)或更高版本。

在這里Palec 的答案進行比較。


采用:

$pdo = new PDO( 
    'mysql:host=hostname;dbname=defaultDbName', 
    'username', 
    'password', 
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") 
); 

它在 PDO 連接上強制使用 UTF-8。 它對我有用。

您必須為連接設置正確的字符集。 charset=utf8選項添加到 DSN (這是 MySQL 特定的!)

$pdo = new PDO(
    'mysql:host=hostname;dbname=defaultDbName;charset=utf8',
    'username',
    'password'
);

但是,在 5.3.6(2011 年 3 月發布)之前的PHP 版本中,您必須使用解決方法,因為 DSN 中的charset選項不受支持。

$pdo = new PDO(
    'mysql:host=hostname;dbname=defaultDbName',
    'username',
    'password',
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);

所有的嘗試都像:

PDO::MYSQL_ATTR_INIT_COMMAND =>"SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci' "

要么

$this->connection = new PDO('mysql:host='.DBHOST.';dbname='.DBNAME.';charset=utf8', DBUSER, DBPASS, self::$opt);

要么

$this->connection->exec("set names utf8");

仍然產生不可讀的文本混亂。

就我而言,問題的原因是:在將數據插入數據庫之前使用了htmlentities 西里爾字母被完全摧毀。

嘗試將 php.ini 中的default_charset值設置為 UTF-8。 或者您可以使用ini_set函數設置它。

此外,如果輸入來自表單提交,請確保您的網頁使用元標記設置為 UTF-8。

與 mysql 或 mariadb 交互時,字符集“utf8”不正確。 您需要使用 utf8mb4。 由於歷史問題,mysql/mariadb 中的 utf8 是 utf8mb3 的別名,它只能包含 utf8 的一個子集(3 個字節而不是 4 個),因此在 PDO DSN 連接字符串中添加 'charset=utf8mb4' 是正確的做法最近的 PHP 版本,不是 charset=utf8。

例如,全彩的便便表情:如果列和 PDO 不是 utf8mb4,則無法存儲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM