MySQL设置名称和MySQL之间的差异的深刻理解(我)_set_charset 浏览:624

说起,尝试使用mysqli_set_charset(mysqli:set_charset)代替集名称。当然,PHP手册中也提到了这个内容,但这并不能解释为什么。
最近,有几个朋友问我这个问题,为什么呢
问了多少人,我也觉得我可以写一篇博客文章,具体介绍一下这个部分的内容。
首先,很多人不知道名字在干什么。
我以前的文章深入到MySQL字符集设置。我已经介绍了三character_set_client / / character_set_results character_set_connection MySQL环境变量。这里是一个简短的介绍。
这三个变量分别告诉MySQL服务器、客户端的编码集、发送到MySQL服务器时的编码集,以及MySQL预期返回的一组代码。
例如,通过使用SET NAMES UTF8
一般来说,使用set的名称是足够的,它也可以保证正确性。为什么我推荐使用mysqli_set_charset(PHP > = 5.0.5)吗
首先,让我们看看什么mysqli_set_charset(注意星号标注,mysql_set_charset喜欢)。
复制代码代码如下所示:
/ / / / php-5.2.11-src EXT mysqli / mysqli_nonapi C线342。
php_function(mysqli_set_charset)
{
my_mysql * MySQL;
* mysql_link zval;
char * cs_name = null;
无符号整型;
如果(zend_parse_method_parameters(zend_num_args()tsrmls_cc,获得())
,操作系统
返回;
}
mysqli_fetch_resource(MySQL,my_mysql *,mysql_link,mysqli_link )
mysqli_status_valid);
如果(mysql_set_character_set(MySQL -> MySQL,cs_name)){
相应的功能 / / *电话libmysql
return_false;
}
return_true;
}

那么什么mysql_set_character_set做
复制代码代码如下所示:
/ / / /客户mysql-5.1.30-src libmysql C线3166:
int stdcall mysql_set_character_set(mysql * MySQL,const char * cs_name)
{
结构charset_info_st CS;
const char * save_csdir = charsets_dir;
如果(MySQL ->选项。charset_dir)
charsets_dir = MySQL -> options.charset_dir;
如果(strlen(cs_name)< my_cs_name_size
(CS = get_charset_by_csname(cs_name,my_cs_primary,该(0 ))))))
{
焦迷{ 10 } my_cs_name_size +;
charsets_dir = save_csdir;
跳过老服务器设置 /名称执行。
如果(mysql_get_server_version(MySQL)<40100)
返回0;
sprintf(buff,集合名称%s
如果(!mysql_real_query(MySQL,buff,strlen(黄色))
{
MySQL ->字符集= CS;
}
}
以下省略

我们可以看到,mysqli_set_charset做了很多超过做集名称:
复制代码代码如下所示:
sprintf(buff,集合名称%s
如果(!mysql_real_query(MySQL,buff,strlen(黄色))
{
MySQL ->字符集= CS;
}

什么是对MySQL的核心结构构件作用的字符集
让我们来谈谈mysql_real_escape_string()。这一功能和mysql_escape_string之间的区别是,它将考虑当前字符集。这个当前字符集是从哪里来的
是的,你猜,这是MySQL ->字符集..
当判断大字符集的特点,mysql_real_string采用不同的策略,根据该成员变量,例如,如果是使用UTF-8,然后libmysql / ctype-utf8 C.将采用。
作为一个例子,默认连接mysql字符集是拉丁文,(经典5c问题):
复制代码代码如下所示:
< PHP
$ db = mysql_connect('localhost:3737,'root ',为123456);
mysql_select_db(测试);
美元= x91 x5c ; / / 摧毁GBK编码,低字节是5C,ASCII是
var_dump(addslashes($));
var_dump(mysql_real_escape_string($,$ dB));
mysql_query(SET NAMES GBK);
var_dump(mysql_real_escape_string($,$ dB));
mysql_set_charset(GBK);
var_dump(mysql_real_escape_string($,$ dB));
>

由于低字节编码,GBK失去是5C,ASCII是,因为除了MySQL(我)_set_charset影响MySQL ->字符集,其他时间MySQL ->字符集是默认,所以结果是:
复制代码代码如下所示:
PHP - F 5c.php美元
字符串(3)
字符串(3)
字符串(3)
字符串(2)

现在大家都清楚了。
推荐文章1
广告