我使用MySQLi從MySQL表中提取阿拉伯數據。所以我通常在程序風格使用:使用MySQLi設置字符集
mysql_query("SET NAMES 'utf8'");
mysql_query('SET CHARACTER SET utf8');
現在我使用的是面向對象的風格,所以我想看看是否有什麼我可以設置,而不是上面?
我只在PHP手冊中發現了這個,所以我做了它,但是如何將名稱設置爲UTF8呢?
$mysqli->set_charset("utf8");
我使用MySQLi從MySQL表中提取阿拉伯數據。所以我通常在程序風格使用:使用MySQLi設置字符集
mysql_query("SET NAMES 'utf8'");
mysql_query('SET CHARACTER SET utf8');
現在我使用的是面向對象的風格,所以我想看看是否有什麼我可以設置,而不是上面?
我只在PHP手冊中發現了這個,所以我做了它,但是如何將名稱設置爲UTF8呢?
$mysqli->set_charset("utf8");
這是相同的:
$ mysqli->查詢( 「集名稱 'UTF8'」);
從手冊:
這是要改變的字符集的優選方式。使用mysqli :: query() 來執行SET NAMES ..不推薦使用。
$mysqli->set_charset("utf8");
就夠了,讓mysqli db驅動程序爲你做這件事。
mysqli_query($conn,"SET NAMES 'latin5'");
$康恩=連接字符串
儘管這段代碼可以回答這個問題,提供有關_why_ 額外的內容及/或_how_它回答 問題將顯著改善其長期 值。請[編輯]你的答案,添加一些解釋。 –
您應該使用
$mysqli->set_charset("utf8");
不要使用SET NAMES
或SET CHARACTER SET
明確使用MySQLi的時候,肯定不使用都喜歡問題提出者原來是這樣的。原因這是一個壞主意:
SET CHARACTER SET utf8
後SET NAMES utf8
其實只是undoes some of the work that SET NAMES
did。PHP手冊explicitly warns us使用mysqli_set_charset
,不SET NAMES
:
這是要改變的字符集的優選方式。不建議使用mysqli_query()來設置它(例如SET NAMES utf8)。有關更多信息,請參閱MySQL字符集概念部分。
引擎蓋下,mysqli_set_charset
是從MySQL C API(或其等效mysqlnd)just a wrapper for mysql_set_character_set
。縱觀docs for that function,我們可以看到它和SET NAMES
之間的區別:
使用的字符集此函數類似於
SET NAMES
聲明,而且是成套的的價值,從而影響通過mysql_real_escape_string()
換句話說,$mysqli->set_charset('foo')
將盡一切SET NAMES foo
做和也確保mysqli_real_escape_string
尊重新的編碼。無可否認,如果您只使用拉丁文1和UTF 8這些嚴格擴展ASCII的編碼(即,它將完全編碼所有ASCII字符串,因爲它們將用ASCII編碼),則使用SET NAMES
而不是set_charset
不會破壞任何內容。但是,如果您使用更多不尋常的編碼(如GBK),那麼您最終可能會歪曲字符串甚至引入SQL injection vulnerabilities that bypass mysqli_real_escape_string
。
這從而很好的做法,只使用set_charset
,不SET NAMES
。 SET NAMES
沒有什麼set_charset
沒有,set_charset
可以避免mysqli_real_escape_string
行爲不正確(或者甚至是不安全)的風險。
您可以使用它。它真的很適合mysqli字符集
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "dbpass";
$dbname = "dbname";
$conn = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname);
mysqli_query($conn,"SET CHARACTER SET 'utf8'");
mysqli_query($conn,"SET SESSION collation_connection ='utf8_unicode_ci'");
你可以發佈自己的 –
對於程序風格的愛好者。
// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
/* change character set to utf8 */
mysqli_set_charset($conn,"utf8");
請不要使用模具()報告錯誤之前閱讀其他的答案。請參閱[錯誤報告的基本信息(https://phpdelusions.net/articles/error_reporting) –
注意'mysqli_set_charset'在程序上存在的風格太 - 有實際能力和工作的程序和OOP樣式使用MySQLi的行爲沒有區別。還要注意,在這裏顯式使用'SET NAMES'或'SET CHARACTER SET'在任何一種樣式中都是錯誤的;總是比較喜歡'mysqli_set_charset'(或其OOP等價物)。 –
做_not_混合'mysql_ *'和'mysqli_ *'接口。只要_not_不使用已棄用(並在PHP 5.7中刪除)'mysql_ *'函數。 –