圣光庇佑我
#1
【 使用环境 】测试环境
【 OB or 其他组件 】
【 使用版本 】
【问题描述】清晰明确描述问题
【复现路径】问题出现前后相关操作
【问题现象及影响】
在OB当前版本中,字符集相关系统变量和mysql基本一致,想咨询下 character_set_client和 character_set_connection参数的意义,在社区版代码中,词法解析部分对于字符串会进行判断,如果character_set_connection不是utf8,则将字符串从character_set_connection转到utf8,这块不知道我理解的是否有误,按照文档的描述,character_set_connection 用于设置收到语句后应转换的字符集,按文档的理解是从character_set_client转化到character_set_connection吗,和代码就有了出入,所以请问这几个参数触发转化的时间具体是在什么时候呢
【附件】
1 个赞
其灵
#3
ob不会从 character_set_client 转化到 character_set_connection,麻烦发下文档链接,我们确认下相关细节。截图中的的代码是parser的一种特殊处理,跟文字描述的场景不完全对应哈。字符集的转换机制比较复杂,咱们暂时还没有相关的源码解析文章,我会给内部反映一下这方面的需求。
圣光庇佑我
#4
这块应转换的字符集该怎么理解呢,这几个变量的意思还是不太理解
1 个赞
其灵
#5
常用字符集类型的转换流程:
- 更新:character_set_client->character_set_connection->表字符集 。
- 查询:表字符集->character_set_connection->character_set_result 。
一般来说character_set_client 和 character_set_connection是一样的,没有太多转化操作。主要是“输入输出”和“存储”的格式之间的转化,举个例子,某个数据库的字符集相关变量如下:
OceanBase(admin@test)>show variables like “%char%”;
±-------------------------------------±--------+
| Variable_name | Value |
±-------------------------------------±--------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb4 |
| validate_password_special_char_count | 0 |
±-------------------------------------±--------+
1 个赞
圣光庇佑我
#6
感谢大佬回复,描述的很清晰。上述词法分析的疑问请问词法分析时,假设时更新吧,在解析单词时,其字符集已经转换从character_set_client->character_set_connection了吗,所以词法分析的时候要把所有字符集统一转换成utf8吗
1 个赞
圣光庇佑我
#7
或者说客户端发送过来的字符集是二进制的character_set_client ,然后服务器用character_set_connection 进行解码,如果这两个不一样还是会有出错的风险,查询的时候从按表字符集解码存储引擎的数据,然后转化为character_set_connection ,再转化为character_set_results 返回,这个理解有问题吗
1 个赞
其灵
#8
没啥问题,字符集不一样就转化呗,也没什么风险,而且这个字符集是自己设置的,按需配置就行。