此文已由作者左裕初授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验

问题

Unipack系统要保存一些越南文的包名,由于这是一个上古系统,处理起来一定要采取庖丁解牛的态度

思路

数据库支不支持(数据库层)

浏览器支持不支持(前端,客户端系统)

应用层支持不支持

数据库层

最重要的当然是我们的字段是采用什么编码的,可以采用如下方法进行查询

How do I see what character set a MySQL database / table / column is?

For Schemas:

SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = "schemaname";

For Tables:

SELECT CCSA.character_set_name FROM information_schema.`TABLES` T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA WHERE CCSA.collation_name = T.table_collation AND T.table_schema = "schemaname" AND T.table_name = "tablename";

For Columns:

SELECT character_set_name FROM information_schema.`COLUMNS` WHERE table_schema = "schemaname" AND table_name = "tablename" AND column_name = "columnname";

查出来是:

mysql> SELECT character_set_name FROM information_schema.`COLUMNS` WHERE table_schema = "apkpack51" AND table_name = "apk_params" AND column_name = "param_value";

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

| character_set_name |

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

| utf8 |

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

1 row in set (0.00 sec)

所以就是utf8咯。

下面我们看看MySQL的utf-8包不包含越南文的支持

mysql> show collation;

collation就相当于是指定了一套字符串的比对方法(大小之类的),对于建索引是很有意义的。

结果:

| utf8_general_ci | utf8 | 33 | Yes | Yes | 1 |

| utf8_bin | utf8 | 83 | | Yes | 1 |

| utf8_unicode_ci | utf8 | 192 | | Yes | 8 |

| utf8_icelandic_ci | utf8 | 193 | | Yes | 8 |

| utf8_latvian_ci | utf8 | 194 | | Yes | 8 |

| utf8_romanian_ci | utf8 | 195 | | Yes | 8 |

| utf8_slovenian_ci | utf8 | 196 | | Yes | 8 |

| utf8_polish_ci | utf8 | 197 | | Yes | 8 |

| utf8_estonian_ci | utf8 | 198 | | Yes | 8 |

| utf8_spanish_ci | utf8 | 199 | | Yes | 8 |

| utf8_swedish_ci | utf8 | 200 | | Yes | 8 |

| utf8_turkish_ci | utf8 | 201 | | Yes | 8 |

| utf8_czech_ci | utf8 | 202 | | Yes | 8 |

| utf8_danish_ci | utf8 | 203 | | Yes | 8 |

| utf8_lithuanian_ci | utf8 | 204 | | Yes | 8 |

| utf8_slovak_ci | utf8 | 205 | | Yes | 8 |

| utf8_spanish2_ci | utf8 | 206 | | Yes | 8 |

| utf8_roman_ci | utf8 | 207 | | Yes | 8 |

| utf8_persian_ci | utf8 | 208 | | Yes | 8 |

| utf8_esperanto_ci | utf8 | 209 | | Yes | 8 |

| utf8_hungarian_ci | utf8 | 210 | | Yes | 8 |

| utf8_sinhala_ci | utf8 | 211 | | Yes | 8 |

| utf8_german2_ci | utf8 | 212 | | Yes | 8 |

| utf8_croatian_ci | utf8 | 213 | | Yes | 8 |

| utf8_unicode_520_ci | utf8 | 214 | | Yes | 8 |

| utf8_vietnamese_ci | utf8 | 215 | | Yes | 8 |

| utf8_general_mysql500_ci | utf8 | 223 | | Yes | 1 |

所以毫无疑问是支持越南文的。

浏览器(客户端系统)

这是请求的返回头,可以看出是utf-8编码的,所以从这个角度来说,客户端也是没有问题的

HTTP/1.1 200 OK

Date: Tue, 08 Dec 2015 09:11:09 GMT

Server: Apache/2.4.12 (Ubuntu)

X-Powered-By: PHP/5.6.11-1ubuntu3.1

Expires: Thu, 19 Nov 1981 08:52:00 GMT

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Pragma: no-cache

Content-Length: 11

Keep-Alive: timeout=5, max=91

Connection: Keep-Alive

Content-Type: application/text;charset=UTF-8

应用层

最麻烦的地方在于应用层,以一个restful接口为例,从数据库取出数据与数据库连接采取的编码有关,生成的json数据又和应用层采用的编码方法有关。确定这个根源的办法其实也很简单,采用控制变量法即可。最后我们发现在建立连接的时候有这么一句:

```php $this->conn = ADONewConnection('mysql');

this−>conn−>PConnect(db_host, dbuser,db_pass, $db_name);

$this->conn->Execute('SET NAMES GBK'); # 数据库使用GBK编码 ```

所以说,为什么越南文插入失败呢,就是因为数据库连接采用了GBK编码,而GBK编码无法啊编码越南文,所以也就无法以正确的姿态插入数据库。

utf-8(浏览器) -> gbk(应用层) -> utf-8(数据库)

为了不牵一发而动全身,我们还是采用了保守的方法,多取了一个utf-8的连接,这样在有需要的时候使用这个连接。

总结

Web的界面乱码是常见的问题,一般来说,只要抓住这三个点,感觉总能找到问题的根源。

更多网易技术、产品、运营经验分享请点击。

mysql 乱码 越南_记一次Unipack越南文乱码Bug的修复相关推荐

  1. java写入文件中文乱码问题_解决Java写入UTF-8文件中文乱码问题

    最近需要从Java中输出UTF-8编码的XML文件,遇到了两次中文乱码问题.一是奇数个汉字出现乱码,二是写入文件的实际编码与XML声明的编码不符.经过几番折腾,终于解决这两个问题,也对Java的字符编 ...

  2. mysql还书过程_记一次安装 MySQL 的过程

    记一次安装 MySQL 的过程 一直以来我用的 MySQL 都是从官网下载的zip压缩包,解压后自己配置的.但是这次安装时遇到了几个坑,特别在这里记录一下. 再次更新, 今天安装 MySQL 8.0. ...

  3. mysql死锁语句_记一次神奇的Mysql死锁排查

    背景 说起Mysql死锁,之前写过一次有关Mysql加锁的基本介绍,对于一些基本的Mysql锁或者死锁都有一个简单的认识,可以看下这篇文章为什么开发人员需要了解数据库锁.有了上面的经验之后,本以为对于 ...

  4. mysql++裸盘_记一次裸迁 MySQL 经历

    记一次裸迁MySQL经历 前言:博主企业有一台企业阿里云机器,因为安装了云锁,造成服务器动不动就给我所死服务器.(就是那种 chattr +i /bin/bash ,分分钟日死狗 )趁着周末,Boos ...

  5. bugfree安装中mysql未安装_记第一次安装bugfree过程,几经曲折,倒在了BUGfree 环境检查的MySQL未安装的地方,求助...

    记第一次安装bugfree过程,几经曲折,倒在了BUGfree 环境检查的MySQL未安装的地方,求助 1.准备工作,下载Xampp && bugfree Xampp http://s ...

  6. mysql 插入慢_记一次生产环境mysql数据库参数优化,值得收藏

    概述 最近在对各个系统的mysql做一些参数上的优化,也开了慢查询,准备后面针对特定sql再进一步优化.下面主要介绍一下一些优化的参数. 1.优化前mysql配置 可以看到基本上是没怎么做优化的. 2 ...

  7. mysql log-update 错误_记一次修复MySQL socker 错误

    问题描述 初次往数据库中source 一个超大的文件,过了一会sql报错 table is full 然后去data 目录查看大小,发现一个表的ibd文件2G,果断删除了这个文件. 没想到继续报错. ...

  8. mysql时区错乱_记一次线上mysql时区错乱

    Mysql查询时间和页面显示时间相差八个小时. 在一次线上程序调用mysql内部函数转化时间戳的时候的bug记录.在本地开发与测试环境都没得问题.但是上线后,程序总是不再状态. 遂开启审阅代码的过程, ...

  9. mysql 总停止运行_记一次解决MySQL经常停止运行的问题 | kTWO-个人博客

    问题背景 在多个月之前,也就是服务器刚刚搭建的时候,标题中的MySQL问题就出现了,很是奇怪,博客过一段时间就毫无征兆的挂掉了,提示连接数据库失败,然后重新启动一下MySQL服务就又可以正常运行了.但 ...

最新文章

  1. 汇编语言学习-寄存器(CPU工作原理)
  2. JDK 竟然是这样实现栈的?
  3. 40 个 SpringBoot 常用的注解,你知道几个?
  4. [py]django url 参数/reverse和HttpResponseRedirect
  5. oracle method_opt,统计量收集Method_Opt参数使用(下)
  6. 某同学正为自己安装不上sqlserver数据库而愁眉苦脸,使用朋友给的方法顿时喜笑颜开,那么朋友到底出了个什么样的方法呢?...
  7. iOS博客 视频课程网站
  8. [CMake] 头文件路径 动态库路径
  9. 树莓派4做服务器哪个系统好,【树莓派】树莓派4无痛安装系统(NOOBS篇)
  10. 控制网页frame vba_V8 bindings 设计isolate,context,world,frame之间的关系(翻译)
  11. android软件开发 开题报告,基于Android手机app开发与设计 毕业设计 开题报告
  12. 多幸运用计算机演奏的乐谱,多幸运简谱-韩安旭演唱-孙世彦制谱
  13. 在Mac上阻止相机和麦克风的方法
  14. Day 41多表查询以及pymysql相关操作 完善
  15. postgres支持AES加密配置
  16. Python:教你如何写一个测量网速的小工具
  17. 【学术篇】不知道该起啥标题了怎么办OvO
  18. 中天视听王 未来软件园
  19. 疫情反复,如何轻松居家办公?——快解析内网穿透
  20. 详细的X-Scan使用教程

热门文章

  1. python爬校花网笔记
  2. el-dialog中中使用echarts
  3. 基于数字光栅投影的结构光三维测量技术与系统研究
  4. 对比度增强CLAHE
  5. 1998考研阅读Text1翻译
  6. 《找你妹2》开发者云中游再声明:热酷涉嫌严重违约发布侵权竞品
  7. Part-Ⅰ4. 开关实现(一)
  8. 估计信噪比 matlab,matlab信噪比估计程序
  9. 项目风险管理---实施定量风险分析
  10. 电机绕组I-pin、Hair-pin、X-pin、S-winding的区别