一次MySQL GBK编码的故障分析

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

故障描述

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

从错误提示来看,有这几个表现:字符串中间的全角单引号字符被加上了反斜杠转义;

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

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

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

故障分析

首先需要查看下 .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();

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

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

通过这些代码可以验证了上述几个现象。全角半角单引号字符确实会被转义;

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

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

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

然后验证在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编码的故障分析相关推荐

  1. mysql字符乱码百度_如何解决MySQL字符集乱码问题

    变量 @a 的字符编码是由参数 CHARACTER_SET_CLIENT 决定的,假设此时编码为 A,也就是变量 @a 的编码. 2. 写入语句在发送到 MySQL 服务端之前的编码由 CHARACT ...

  2. mysql blob 写入表_文件存入MYSql表的blob

    向MYSql的数据表中存入文件,这看似没有什么大问题,只要把文件存入longblob字段就行了.但是最近的实践发现看似简单的背后其实有很多陷阱.下面就来分享一下我遇到的问题及我的解决办法. 先介绍一下 ...

  3. mysql 连接中文乱码_彻底解决mysql中文乱码的办法

    MySQL会出现中文乱码的原因不外乎下列几点: 1.server本身设定问题,例如还停留在latin1 2.table的语系设定问题(包含character与collation) 3.客户端程式(例如 ...

  4. mysql 数据库安装命令_教你MySQL数据库的编译安装以及命令详解(5.7版本)

    一.安装MySQL所需的环境依赖包 [root@localhost opt]# yum -y install gcc gcc-c++ make ncurses ncurses-devel bison ...

  5. mysql子查询设置_什么是mysql子查询?如何利用子查询进行过滤?

    子查询 MySQL 4.1引入了对子查询的支持,所以要想使用本章描述的SQL,必须使用MySQL 4.1或更高级的版本. SELECT语句 是SQL的查询.迄今为止我们所看到的所有 SELECT 语句 ...

  6. 怎样检查mysql是否安装成功_怎么检验mysql安装成功

    MySQL安装成功后,怎么校验MySQL成功安装呢? 检验mysql安装成功的方法: 1.命令行: net start mysql 如果能启动,那说明安装成功了. 如果想查询默认的数据库,你可以用my ...

  7. mysql db模块下载_易语言MySql数据库操作类V1.0模块源码

    易语言MySql数据库操作类V1.0模块源码 易语言MySql数据库操作类V1.0模块源码 系统结构:MySql数据库连接类_测试子程序,置连接选项,连接,关闭,是否已连接,取连接句柄,置连接句柄,执 ...

  8. 阿里云 mysql 导出数据库备份_导出整个mysql数据库备份

    mysql和mssql的备份和恢复数据的方法 mysql数据库的备份方法可以用 导出要用到MySQL的mysqldump工具,基本用法是: shell> mysqldump [OPTIONS] ...

  9. 向mysql数据库发送指令_常用的MySQL数据库命令大全

    飞信2017V5.6.8860.0 官方正式版 类型:聊天其它大小:69.1M语言:中文 评分:9.6 标签: 立即下载 常用的MySQL命令大全 一.连接MySQL 格式: mysql -h主机地址 ...

最新文章

  1. window系统查看端口被哪个进程占用了
  2. java编写地铁购票系统_Java_地铁购票系统
  3. 【双百解法】剑指 Offer 15. 二进制中1的个数
  4. bert 多义词_自然语言处理:Bert及其他
  5. 《Linux内核设计与实现》读书笔记(12)--- 内存管理(2)
  6. 分解原理_葛兰维均线的数学拟合原理--傅立叶函数的分解的应用
  7. java导出pdf格式_Java导出Pdf格式表单
  8. git 查询提交明细_git log 查看提交记录
  9. 亚马逊 站内广告数据分析
  10. 实用PS-抠图换背景
  11. 【期末不挂】离散数学 · 常考题型你都会了叭~
  12. 1.8万字详解实时数仓建设方案
  13. 从语言之争到年龄焦虑
  14. php 倒置,PHP依赖倒置案例详解
  15. C++ string类和常用接口的实现
  16. TCHAR char
  17. Python编程练习题目汇总
  18. javaIO流详解--读取,写入文件的所有类与方法
  19. 【Python入门指北】 Python计算机二级知识点
  20. python发微信-python实现向微信用户发送每日一句

热门文章

  1. 斑马属于谁?谁爱喝矿泉水?
  2. centos7安装vmwaretools解决mnt挂载为空问题
  3. 工业机器人码垛教学实施_工业机器人码垛方案设计.doc
  4. 新年伊始SIMCOM芯讯通2021年代理商大会在沪召开
  5. 检测到 #include 错误。请更新 includePath。已为此翻译单元 禁用波形曲线。C/C++ 无法打开 源 文件 bits/stdc++.hC/C++
  6. 微信小程序:OCR识别
  7. android传值给activity,android怎么实现PopuWindow与Activity传值
  8. [Python基础] @statismethod和@classmethod中的注意事项
  9. 大模型产业落地关键战打响!百度首发行业大模型,外加一口气十连发
  10. c语言随机产生10题,详解C语言的随机数生成及其相关题目