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/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