背景数据库表信息乱码问题
影响数据库连接初始化中断
原因init_connect参数设置问题,参数为不可执行语句。
1.1 DB字符集参数
#数据库中的字符集设置(以下全部为修改过后的结果)
mysql> select user();
----------------
| user() |
----------------
| rootlocalhost |
----------------
#会话级的参数设置仅对当前回话有效set names utf8是会话级的参数当前会话可以修改当前的连接参数从而覆盖全局参数设置默认全局参数设置。
#由于上线是super账户会话级参数如下而普通账户的参数都是utf8,所以查看表时导致乱码而super账户下正常显示。
#乱码最终的解决方案是super账户所有会话级参数(除character_set_results设置为latin1)设置为utf8, 查看表的信息执行alter...modify... (内部原理详见后文)
mysql>show variables like "%char%";
-----------------------------------------------------------------
| Variable_name | Value |
-----------------------------------------------------------------
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8 |
#全局参数设置对全局用户有效
mysql>show global variables like "%char%";
-----------------------------------------------------------------
| Variable_name | Value |
-----------------------------------------------------------------
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
#连接初始化参数,该参数对super用户无效仅对普通用户有效每一个连接首先进行初始化:执行表中的sql. set names utf8等效set 客户端的字符集参数(client,connection,results).
mysql > show global variables like "%init%";
----------------------------------------
| Variable_name | Value |
----------------------------------------
| init_connect | set names utf8 |
1.2 字符集解释与设置
#character_set_client :客户端来源使用的字符集
#character_set_connection :连接层使用的字符集
#character_set_database : 当前数据库使用的字符集(默认latin1)
#character_set_results 显示结果使用的字符集
#character_set_server : DB内部使用的字符集
#character_set_system : 系统元数据使用的字符集
#init_connetc : 普通用户连接执行其值(sql)
msyql> set names utf8;
#set names 等效以下
msyql> set character_set_clientutf8;
mysql> set character_set_connectionutf8;
myqsl> set character_set_resultsutf8;
#init_connect"set names utf8"; 保证普通用户的连接使用的utf8字符集。php中连接数据库前也进行字符集的初始化设置。
#这3个参数并不能直接在配置文件中设置一劳永逸的设置方法是在配置文件中
[msyql]
default-character-set utf8
[mysqld]
character-set-server utf8 (5.6版本也可以是default-character-set utf8 )
1.3 DB字符集的转换过程
1.4 kaogmat转换方案
上线客户端参数是使用的latin1, 因此查看显示结果(传出)时设置会话参数为 character_set_resultslatin1, 其它参数(传入)为utf8, 根据表的信心重新执行
alter table table_name modify col_name ......modify....;