{{ item.name }}
{{ item.name }}

{{ it.name }}

{{ it.text }}

{{ it.name }}

{{ innerIt.name }}

{{ innerIt.text }}

{{news.time}}
{{news.title}}
一次MySQL GBK编码的故障分析
2020-05-09发布 899浏览

一次MySQL GBK编码的故障分析

最近有用户遇到MySQL GBK字符集的一个坑,我也是第一次遇到,网上也没看此类case,所以整理了故障分析报告分享给大家,供参考。


故障描述

用户描述说:在使用MySQL for .NET Connector的时候,MySQL客户端和服务端的字符集设置都是GBK的情况下,遇到中文输入中夹杂全角字符提示语法错误,不清楚为何被添加了转义符号,怀疑和全角字符有关。


一次MySQL GBK编码的故障分析-爱可生



从错误提示来看,有这几个表现:

  1. 字符串中间的全角单引号字符被加上了反斜杠转义;

  2. 字符串末尾的半角单引号字符被加上了反斜杠转义;

  3. 整个字符串被单引号包裹;

  4. 提示语法错误,而非数据格式相关错误。


故障分析

首先需要查看下 .net 驱动源码,确认以上1、2、3现象确实是驱动行为。

这里定义了需要转移哪些字符,其中包括全角和半角单引号了。

enum CharClass : byte

{

None,

Quote,

Backslash

}

private static string stringOfBackslashChars ="\\u005c\\u00a5\\u0160\\u20a9\\u2216\\ufe68\\uff3c";

private static string stringOfQuoteChars =

"\\u0022\\u0027\\u0060\\u00b4\\u02b9\\u02ba\\u02bb\\u02bc\\u02c8\\u02ca\\u02cb\\u02d9\\u0300\\u0301\\u2018\\u2019\\u201a\\u2032\\u2035\\u275b\\u275c\\uff07";

private static CharClass[ ] charClassArray = makeCharClassArray();

一次MySQL GBK编码的故障分析-爱可生


为这些字符添加反斜杠转义符

一次MySQL GBK编码的故障分析-爱可生


数据写入时最外层会用单引号包裹。

一次MySQL GBK编码的故障分析-爱可生


通过这些代码可以验证了上述几个现象。

  1. 全角半角单引号字符确实会被转义;

  2. 转义原因是外层使用的单引号。


通过这些现象,我猜测是因为转义失败导致。接下来通过一些方法重现故障场景,验证我的猜想。

首先验证在utf8编码下的表现,无论外层是双引号还是单引号,内部的单引号都能正常转义。

一次MySQL GBK编码的故障分析-爱可生


然后验证在gbk编码下的表现,字符串包含汉字的情况下,提示语法错误与用户遇到的错误一致,重现故障场景。


通过查看编码表得知5C代表反斜杠 ,说明单引号没有被正常转义。

mysql> select hex('茅\'');

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''茅\'')' at line 1

mysql> select hex("茅\'");

+--------------+

| hex("茅\'") |

+--------------+

| E88C855C27 |

+--------------+

1 row in set (0.00 sec)


无汉字夹杂可以正常转义。

一次MySQL GBK编码的故障分析-爱可生



验证是否和全角字符有关,也可以正常转义,说明不是全角字符影响。

一次MySQL GBK编码的故障分析-爱可生
上一篇
semi-sync插件崩溃导致MySQL重启的故障分析
400-820-6580 13916131869
marketing@actionsky.com
上海市闵行区万源路2138号泓茂中心2号楼
产品详情
关系型数据库
AI数据库
数据库智能管理平台
数据库生态产品
行业案例
金融行业
新零售行业
制造业
通信行业
更多
公司动态
最新新闻
国产化信息
技术分享
关于我们
公司简介
公司分布
国家专利
资质认证
扫码关注公众号
© Copyright 2017, All rights reserved by: 上海爱可生信息技术股份有限公司 沪ICP备12003970号-1 | 法律声明 | 网站地图
沪公网安备 31010402003331号