mysql中变量character_set_connection的具体作用

如题。通常的使用中,character_set_client,character_set_connection这两个变量的值是一样的,也就是说查询不需要进行编码转换。这样看来变量character_set_connection有些多余。当查询进入时,查询会被服务器从character_set_client转换到character_set_connection,当查询执行时,查询会被服务器从character_set_connection转换到列字符集。查询反回时,数据直接被服务器从列字符集转换到character_set_results。很显然查询进入比查询返回多经历了一次转换,这是必须的吗,意义何在?

参考mysql中文手册:

10.3.6. 连接字符集和校对
一些字符集和校对规则系统变量与客户端和服务器的交互有关。在前面的章节中已经提到过部分内容:
·         服务器字符集和校对规则可以用作character_set_server和collation_server变量的值。

·         默认数据库的字符集和校对规则可以用作character_set_database和collation_database变量的值。

在客户端和服务器的连接处理中也涉及了字符集和校对规则变量。每一个客户端有一个连接相关的字符集和校对规则变量。

考虑什么是一个“连接”:它是连接服务器时所作的事情。客户端发送SQL语句,例如查询,通过连接发送到服务器。服务器通过连接发送响应给客户端,例如结果集。对于客户端连接,这样会导致一些关于连接的字符集和 校对规则的问题,这些问题均能够通过系统变量来解决:

·         当查询离开客户端后,在查询中使用哪种字符集?

服务器使用character_set_client变量作为客户端发送的查询中使用的字符集。

·         服务器接收到查询后应该转换为哪种字符集?

转换时,服务器使用character_set_connection和collation_connection系统变量。它将客户端发送的查询从character_set_client系统变量转换到character_set_connection(除非字符串文字具有象_latin1或_utf8的引介词)。collation_connection对比较文字字符串是重要的。对于列值的字符串比较,它不重要,因为列具有更高的 校对规则优先级。

·         服务器发送结果集或返回错误信息到客户端之前应该转换为哪种字符集?

character_set_results变量指示服务器返回查询结果到客户端使用的字符集。包括结果数据,例如列值和结果元数据(如列名)。

这个是mysql的字符集机制,还是有一定作用的

这样做,允许不同的客户端具有不同的字符集。典型的例子就是,我有一个utf-8的站点,这个站点就是一个charset client为utf-8的客户端。与此同时,我有可能需要在一个gbk的终端上读写数据库,这又是一个客户端,不过它的字符集是gbk。

不同的连接,它们都有各自的character_set_client,character_set_connection,互不相关。你上面所说的那种需求,我感觉即使没有character_set_connection,只需要character_set_client一样可以实现。

时间: 2024-11-07 12:47:49

mysql中变量character_set_connection的具体作用的相关文章

mysql中变量赋值

http://www.cnblogs.com/qixuejia/archive/2010/12/21/1913203.html sql server中变量要先申明后赋值: 局部变量用一个@标识,全局变量用两个@(常用的全局变量一般都是已经定义好的): 申明局部变量语法:declare @变量名 数据类型:例如:declare @num int: 赋值:有两种方法式(@num为变量名,value为值) set @num=value;   或   select @num=value; 如果想获取查询

MySQL中变量的总结

本文对MySQL中局部变量.用户变量.系统变量的理解进行总结. 一.局部变量 局部变量由DECLARE语句声明: DECLARE var_name[,...] type [DEFAULT value] 默认值由DEFAULT子句来声明,默认值也可以是一个表达式. 局部变量的作用范围仅限在它被声明的BEGIN...END块内,当语句执行完毕,局部变量就消失了. 二.用户变量 可以先在用户变量中保存值然后在以后引用它:这样可以将值从一个语句传递到另一个语句.用户变量与连接有关.也就是说,一个客户端定

MySQL中@变量的妙用

背景需求:如下图所示,需要将下面为空的表名,填充为第一行所示的表名 第一次处理失败了 第二次使用成功 使用的SQL语句如下: set @tmp_var=''; select b.id,b.table_name_new,b.column_name from( select id,table_name,if(table_name!='',table_name,@tmp_var) table_name_new,if(table_name!='', @tmp_var:=table_name, @tmp_

MySql 申明变量以及赋值

sql server中变量要先申明后赋值: 局部变量用一个@标识,全局变量用两个@(常用的全局变量一般都是已经定义好的): 申明局部变量语法:declare @变量名 数据类型:例如:declare @num int: 赋值:有两种方法式(@num为变量名,value为值) set @num=value;   或   select @num=value; 如果想获取查询语句中的一个字段值可以用select给变量赋值,如下: select @num=字段名 from 表名 where …… mys

[转载]mysql中实现行号,oracle中的rowid

mysql中实现行号需要用到MYSQL的变量,因为MySql木有rownumber. MYSQL中变量定义可以用 set @var=0 或 set @var:=0 可以用=或:=都可以,但是如果变量用在其他语句中,如:select那么必须用:=,因为=会被当作一个比较符号 1 select @rownum:[email protected]+1 as rownum, b.* from (select @rownum:=0) a, b 这个很有用哦,比如要取到排名好多的.

MySql中的变量定义

MySql中的变量定义 根据mysql手册,mysql的变量分为两种:系统变量和用户变量.但是在实际使用中,还会遇到诸如局部变量.会话变量等概念.根据个人感觉,mysql变量大体可以分为四种类型: 一.局部变量. 局部变量一般用在sql语句块中,比如存储过程的begin/end.其作用域仅限于该语句块,在该语句块执行完毕后,局部变量就消失了. 局部变量一般用declare来声明,可以使用default来说明默认值. 例如在存储过程中定义局部变量: drop procedure if exists

MySql中的变量定义(转)

根据mysql手册,mysql的变量分为两种:系统变量和用户变量.但是在实际使用中,还会遇到诸如局部变量.会话变量等概念.根据个人感觉,mysql变量大体可以分为四种类型: 一.局部变量. 局部变量一般用在sql语句块中,比如存储过程的begin/end.其作用域仅限于该语句块,在该语句块执行完毕后,局部变量就消失了. 局部变量一般用declare来声明,可以使用default来说明默认值. 例如在存储过程中定义局部变量: drop procedure if exists add; create

mysql中while循环以及变量声明以及dilimiter

首先我们查看一个正确的完整的一个存储过程 ①其中delimiter命令解释如下:默认情况下,delimiter是分号:.在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令. 这种默认以分号执行命令会使存储过程创建不完整就被执行,显然会报错.所以用delimiter命令将默认的:变成||(也可以是&& ,//什么的).执行完后 把某段语句写完之后,再用||结束,提交执行.最后用delimiter 命令修改回来. ②mysql中局部变量声明只可写在sql语句块中,

MYSQL 中的变量

1.用户自己定义变量 2.系统变量(全局变量,会话变量) ---------------------------------------------------------------------------------------------------------------------------------------------------------------- 1.用户自定义变量 set @var_name = 0.0;  这样就可以了.不像SQL Server 样还要decla