2012-05-31 132 views
8

我使用MySQLi從MySQL表中提取阿拉伯數據。所以我通常在程序風格使用:使用MySQLi設置字符集

mysql_query("SET NAMES 'utf8'"); 
mysql_query('SET CHARACTER SET utf8'); 

現在我使用的是面向對象的風格,所以我想看看是否有什麼我可以設置,而不是上面?

我只在PHP手冊中發現了這個,所以我做了它,但是如何將名稱設置爲UTF8呢?

$mysqli->set_charset("utf8"); 
+0

注意'mysqli_set_charset'在程序上存在的風格太 - 有實際能力和工作的程序和OOP樣式使用MySQLi的行爲沒有區別。還要注意,在這裏顯式使用'SET NAMES'或'SET CHARACTER SET'在任何一種樣式中都是錯誤的;總是比較喜歡'mysqli_set_charset'(或其OOP等價物)。 –

+0

做_not_混合'mysql_ *'和'mysqli_ *'接口。只要_not_不使用已棄用(並在PHP 5.7中刪除)'mysql_ *'函數。 –

回答

9

這是相同的:

$ mysqli->查詢( 「集名稱 'UTF8'」);

從手冊:

這是要改變的字符集的優選方式。使用mysqli :: query() 來執行SET NAMES ..不推薦使用。

$mysqli->set_charset("utf8");就夠了,讓mysqli db驅動程序爲你做這件事。

+0

所以,我要保留我在PHP手冊中找到的內容+你在這裏有什麼,或者足夠了嗎? –

+2

該文檔說'...使用mysqli :: query()來執行SET NAMES ..不推薦。http://php.net/manual/de/mysqli.set-charset.php – sofl

+1

@sys_debug它看起來像就像你不需要做'集名稱「utf8'','$ mysqli-> set_charset(‘UTF-8’)'就足夠了。 – xdazz

-1
mysqli_query($conn,"SET NAMES 'latin5'");

$康恩=連接字符串

+1

儘管這段代碼可以回答這個問題,提供有關_why_ 額外的內容及/或_how_它回答 問題將顯著改善其長期 值。請[編輯]你的答案,添加一些解釋。 –

6

您應該使用

$mysqli->set_charset("utf8"); 

不要使用SET NAMESSET CHARACTER SET明確使用MySQLi的時候,肯定不使用都喜歡問題提出者原來是這樣的。原因這是一個壞主意:

  • 調用SET CHARACTER SET utf8SET 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 NAMESSET NAMES沒有什麼set_charset沒有,set_charset可以避免mysqli_real_escape_string行爲不正確(或者甚至是不安全)的風險。

1

您可以使用它。它真的很適合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'"); 
+0

你可以發佈自己的 –

0

對於程序風格的愛好者。

// Create connection 
$conn = mysqli_connect($servername, $username, $password, $dbname); 

/* change character set to utf8 */ 
mysqli_set_charset($conn,"utf8"); 
+0

請不要使用模具()報告錯誤之前閱讀其他的答案。請參閱[錯誤報告的基本信息(https://phpdelusions.net/articles/error_reporting) –