[英]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 utf8
和SET 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
解碼。 這就是我現在的做法。
您必須為連接設置正確的字符集。 將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.