mysql_set_charset

(PHP 5 >= 5.2.3)

mysql_set_charset設定客戶端字元集

警告

此擴充套件在 PHP 5.5.0 中已棄用,並在 PHP 7.0.0 中移除。應改用 MySQLiPDO_MySQL 擴充套件。另請參閱 MySQL:選擇 API 指南。此函式的替代方法包括

描述

mysql_set_charset(string $charset, resource $link_identifier = NULL): bool

設定當前連線的預設字元集。

引數

charset

有效的字元集名稱。

link_identifier

MySQL 連線。如果未指定連結識別符號,則假定 mysql_connect() 最後開啟的連結。如果未找到此類連結,它將嘗試建立一個連結,就像 mysql_connect() 被呼叫時沒有引數一樣。如果未找到或建立連線,則會生成 E_WARNING 級別的錯誤。

返回值

成功時返回 true,失敗時返回 false

注意

注意:

此函式需要 MySQL 5.0.7 或更高版本。

注意:

這是更改字元集的首選方法。使用 mysql_query() 設定它(例如 SET NAMES utf8)是不推薦的。有關更多資訊,請參見 MySQL 字元集概念 部分。

新增說明

使用者貢獻的說明 8 個說明

33
Ashus
15 年前
我需要從一個特定的網路託管服務中訪問資料庫。頁面使用 UTF-8 編碼,表單接收的資料應在不更改編碼的情況下插入資料庫。資料庫也使用 UTF-8。

SET character set 'utf8' 或 SET names 'utf8' 在這裡不能正常工作,因此此變通方法確保所有變數都設定為 utf-8。

<?php

// ... (建立到 mysql 的連線) ...

mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'", $conn);

$re = mysql_query('SHOW VARIABLES LIKE "%character_set%";')or die(mysql_error());
while (
$r = mysql_fetch_assoc($re)) {var_dump ($r); echo "<br />";} exit;

?>

現在所有重要的變數都是 utf-8,我們可以安全地使用 INSERT 或 SELECT 與 mysql_escape_string($var) 一起使用,而無需任何編碼函式。
15
nabeelmoidu at gmail dot com
16 年前
以下是如何使用此功能的示例

我正在使用來自 http://oss.oracle.com/projects/php/ 的 PHP 5.2.5

我想將阿拉伯字元以 UTF8 格式儲存在資料庫中,正如許多 Google 搜尋結果中建議的那樣,我嘗試使用

mysql_query("SET NAMES 'utf8'");

以及

mysql_query("SET CHARACTER SET utf8 ");

但它不起作用。

使用以下方法,它完美執行

$link = mysql_connect('localhost', 'user', 'password');
mysql_set_charset('utf8',$link);

一旦設定了這一點,我們就不需要手動使用 utf8_encode() 或其他函式將文字編碼為 utf。阿拉伯語(或任何支援 UTF8 的語言)文字可以直接傳遞到資料庫,PHP 會自動將其轉換。
例如。
<?php
$link
= mysql_connect('localhost', 'user', 'password');
mysql_set_charset('utf8',$link);
$db_selected = mysql_select_db('emp_feedback', $link);
if (!
$db_selected) { die ('Database access error : ' . mysql_error());}
$query = "INSERT INTO feedback ( EmpName, Message ) VALUES ('$_empName','$_message')";
mysql_query($query) or die('Error, Feedback insert into database failed');
?>
請注意,這裡 $_empName 儲存在英文中,而 $_message 儲存在阿拉伯語中。
1
Janez R.
16 年前
我假設這是 PHP 以前版本中的等效項(儘管添加了一些引數驗證和預設值!)。
<?
if (!function_exists('mysql_set_charset')) {
function mysql_set_charset($charset,$dbh)
{
return mysql_query("set names $charset",$dbh);
}
}
?>
-7
nag QWE svgfr RTY org
16 年前
以下是 Janez R. 函式的改進版本
<?php
if (function_exists('mysql_set_charset') === false) {
/**
* 設定客戶端字元集。
*
* 注意:此函式需要 MySQL 5.0.7 或更高版本。
*
* @see https://php.net.tw/mysql-set-charset
* @param string $charset 有效的字元集名稱
* @param resource $link_identifier MySQL 連線
* @return 成功時返回 TRUE,失敗時返回 FALSE
*/
function mysql_set_charset($charset, $link_identifier = null)
{
if (
$link_identifier == null) {
return
mysql_query('SET CHARACTER SET "'.$charset.'"');
} else {
return
mysql_query('SET CHARACTER SET "'.$charset.'"', $link_identifier);
}
}
}
?>
-12
emeszenes at gmail dot com
10 年前
給 nabeelmoidu at gmail dot com 的訊息

以下程式碼對我有用

$mysqli = mysqli_connect( ... );
mysqli_query( $mysqli, 'SET NAMES "utf8" COLLATE "utf8_general_ci"' );

或者只是

mysqli_set_charset( $mysqli, 'utf8' );

致敬,祝你好運!
-6
Anonymous
16 年前
實際上,此函式也存在於 MySQL 4.1.13 及更高版本中的客戶端庫中。因此,實際的版本要求是 MySQL >= 5.0.7 或,如果您使用的是 MySQL 4,則 >= 4.1.13。
-8
Ronald
15 年前
我需要撤回下面的大部分帖子。後來我發現是這樣的

1. 如果你不使用 mysql_set_char,mysql 不會進行任何轉換,因此會將 utf8 字元位元組按原樣儲存。如果你從資料庫中檢索這個位元組並在 utf8 頁面中輸出它,它會正常顯示,但是如果其他應用程式查詢這個位元組(期望找到一個 latin1 位元組),它們就會出錯。

2. 之前提到的“bug”只會在你語句中使用 ucase 或 lcase 函式時出現(例如:latin1_col = ucase('utf8 字串')

希望這有幫助,Ronald
-13
Ronald
15 年前
我只是希望下面的文字能幫助那些正在與字元集編碼作鬥爭的人,特別是當 php 字元集與 mysql 字元集不同的時候。我還要補充一點,我真的認為 php 手冊中關於 mysql 函式的部分,在這方面缺乏很多重要的細節。有人可以在這裡新增一些有用的文字嗎?

我的情況是:PHP 5.2.4,MySql 4.1.15。一個完全使用 utf-8 編碼的 php web 應用程式和一個使用 latin1 字元集的 mysql 資料庫。

為了使它工作,我必須

1. 將所有程式碼檔案(php、html、inc、js 等)建立並存儲在 utf-8 字元集中。你的編輯器應該有這個選項,如果沒有就放棄吧。

2. 檢查你的編輯器是否在檔案開頭添加了 BOM (http://en.wikipedia.org/wiki/Byte-order_mark)。如果需要,可以使用十六進位制編輯器來檢測它們。

3. 透過在你的 .htaccess 中新增 'AddDefaultCharset utf-8',將你的 apache 環境設定為 utf-8。如果你不使用 apache,請在你的 php.ini 中新增 'default_charset utf-8'。你只需要做其中一個(不能同時做),php 會在需要的地方使用 apache 設定。

4. 另外,在你的 html 頭部新增這個元標籤:'<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />'。這將幫助那些忽略 utf 響應頭的愚蠢瀏覽器(哦,又是 IE?),使它們傳送給它們。

5. 檢查上面提到的內容是否被監聽,方法是在 firefox 中檢查你的頁面的“頁面資訊”。它應該顯示 2 (!!) 個 utf-8 條目。

======== 到目前為止,所有這些都與 mysql 無關 ;-) ======

6. *不要*(重複,不要!)設定 'names'(set names *)或任何 'character set'(set character set *)(與這些頁面上告訴你的內容相反)。

7. 透過列出 mysql 查詢 'SHOW session VARIABLES' 的結果來檢查前一項。這裡所有的 char_sets 都應該顯示 'latin1',除了系統字元集,它總是 'utf8'。所有排序規則都應該顯示 'latin1_*'。此外,php 函式 mysql_client_encoding() 也應該返回 latin1(雖然我不明白為什麼;這個值意味著什麼,我認為如果 php(作為客戶端)是 utf8 編碼的,那麼它應該是 utf8?)

8 最後,透過將此字串儲存在你的資料庫中並在你的網頁中輸出它來測試上述內容:'Iñtërnâtiônàlizætiøn and €'。

現在,在測試和除錯上述發現的過程中,有趣的是
1. 如果我執行 'mysql_set_charset('utf8')' _OR_ 'mysql_query("SET NAMES 'utf8'");',然後執行一個包含 'where char_column = 'abc'' 的查詢,它會因 'Illegal mix of collations' 而失敗。

2. 如果我執行 'mysql_query("SET character_set_client = 'utf8';"); mysql_query("SET character_set_result = 'utf8';")',查詢會成功,但非 ASCII 字元會在瀏覽器中顯示亂碼。

3. 但是上述 2 點在我的本地開發機器上執行良好(php 5.2.3 & mysql 5.0.45)!!!!!!!!

這讓我得出以下 3 個結論

1. Php-mysql-function 庫(5.2.+)在將 utf-8 查詢和結果轉換到/從 latin1 時做得很好!最好讓 php 幫你處理這些,而不是讓 mysql 來處理。

2. Mysql(4.0.+)有一個或多個 bug(好吧,讓我們說是不完整的特性),涉及字元集轉換,這些 bug 在 5.0.+ 中得到了解決。

3. 這方面的文件不夠完善!(否則我就不必寫這些了)

最後一點說明:很明顯,存在於 utf8 中但不屬於 latin1 的字元(反之亦然)將在 utf8-latin1-utf8 轉換過程中丟失。

如果上述內容有任何錯誤或不完整,請隨時更正!(或者更好的是,在 php 手冊中新增一章 :-)

致敬,Ronald
To Top