mysql gbk编码不全_一次MySQL GBK编码的故障分析
一次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编码的故障分析相关推荐
- mysql字符乱码百度_如何解决MySQL字符集乱码问题
变量 @a 的字符编码是由参数 CHARACTER_SET_CLIENT 决定的,假设此时编码为 A,也就是变量 @a 的编码. 2. 写入语句在发送到 MySQL 服务端之前的编码由 CHARACT ...
- mysql blob 写入表_文件存入MYSql表的blob
向MYSql的数据表中存入文件,这看似没有什么大问题,只要把文件存入longblob字段就行了.但是最近的实践发现看似简单的背后其实有很多陷阱.下面就来分享一下我遇到的问题及我的解决办法. 先介绍一下 ...
- mysql 连接中文乱码_彻底解决mysql中文乱码的办法
MySQL会出现中文乱码的原因不外乎下列几点: 1.server本身设定问题,例如还停留在latin1 2.table的语系设定问题(包含character与collation) 3.客户端程式(例如 ...
- mysql 数据库安装命令_教你MySQL数据库的编译安装以及命令详解(5.7版本)
一.安装MySQL所需的环境依赖包 [root@localhost opt]# yum -y install gcc gcc-c++ make ncurses ncurses-devel bison ...
- mysql子查询设置_什么是mysql子查询?如何利用子查询进行过滤?
子查询 MySQL 4.1引入了对子查询的支持,所以要想使用本章描述的SQL,必须使用MySQL 4.1或更高级的版本. SELECT语句 是SQL的查询.迄今为止我们所看到的所有 SELECT 语句 ...
- 怎样检查mysql是否安装成功_怎么检验mysql安装成功
MySQL安装成功后,怎么校验MySQL成功安装呢? 检验mysql安装成功的方法: 1.命令行: net start mysql 如果能启动,那说明安装成功了. 如果想查询默认的数据库,你可以用my ...
- mysql db模块下载_易语言MySql数据库操作类V1.0模块源码
易语言MySql数据库操作类V1.0模块源码 易语言MySql数据库操作类V1.0模块源码 系统结构:MySql数据库连接类_测试子程序,置连接选项,连接,关闭,是否已连接,取连接句柄,置连接句柄,执 ...
- 阿里云 mysql 导出数据库备份_导出整个mysql数据库备份
mysql和mssql的备份和恢复数据的方法 mysql数据库的备份方法可以用 导出要用到MySQL的mysqldump工具,基本用法是: shell> mysqldump [OPTIONS] ...
- 向mysql数据库发送指令_常用的MySQL数据库命令大全
飞信2017V5.6.8860.0 官方正式版 类型:聊天其它大小:69.1M语言:中文 评分:9.6 标签: 立即下载 常用的MySQL命令大全 一.连接MySQL 格式: mysql -h主机地址 ...
最新文章
- window系统查看端口被哪个进程占用了
- java编写地铁购票系统_Java_地铁购票系统
- 【双百解法】剑指 Offer 15. 二进制中1的个数
- bert 多义词_自然语言处理:Bert及其他
- 《Linux内核设计与实现》读书笔记(12)--- 内存管理(2)
- 分解原理_葛兰维均线的数学拟合原理--傅立叶函数的分解的应用
- java导出pdf格式_Java导出Pdf格式表单
- git 查询提交明细_git log 查看提交记录
- 亚马逊 站内广告数据分析
- 实用PS-抠图换背景
- 【期末不挂】离散数学 · 常考题型你都会了叭~
- 1.8万字详解实时数仓建设方案
- 从语言之争到年龄焦虑
- php 倒置,PHP依赖倒置案例详解
- C++ string类和常用接口的实现
- TCHAR char
- Python编程练习题目汇总
- javaIO流详解--读取,写入文件的所有类与方法
- 【Python入门指北】 Python计算机二级知识点
- python发微信-python实现向微信用户发送每日一句
热门文章
- 斑马属于谁?谁爱喝矿泉水?
- centos7安装vmwaretools解决mnt挂载为空问题
- 工业机器人码垛教学实施_工业机器人码垛方案设计.doc
- 新年伊始SIMCOM芯讯通2021年代理商大会在沪召开
- 检测到 #include 错误。请更新 includePath。已为此翻译单元 禁用波形曲线。C/C++ 无法打开 源 文件 bits/stdc++.hC/C++
- 微信小程序:OCR识别
- android传值给activity,android怎么实现PopuWindow与Activity传值
- [Python基础] @statismethod和@classmethod中的注意事项
- 大模型产业落地关键战打响!百度首发行业大模型,外加一口气十连发
- c语言随机产生10题,详解C语言的随机数生成及其相关题目