着重基础之—MySql Blob类型和Text类型
着重基础之—MySql Blob类型和Text类型
在经历了几个Java项目后,遇到了一些问题,在解决问题中体会到基础需要不断的回顾与巩固。
最近做的项目中,提供给接口调用方数据同步接口,传输的数据格式是Json串。由于json串的结构层级较多,数据量也不少。在设计数据库的时候,选择了Blob类型做为字段类型。一切的一切就打这开始,同步服务正常运作,但是问题慢慢的暴露了出来,客户端在暂时我所提供的数据的时候,中文总是显示乱码,乱码,乱码,一直乱码。
问题的分析路径
1.查看了数据库连接字符串,characterEncoding=utf8 ,配置正常。
2.询问接口调用方,编码格式一致,utf8。
3.查看数据库编码格式,utf8,正常。
4.查看数据表编码格式,utf8,正常。
然后问题依然存在,中文数据通过查询脚本查出来的结果都显示正常,但是一到网页上依然是乱码,乱码。于是把线上的数据导出到本地一份,接着观察,发现中文乱码处可以看出,一个中文被3个字节所代替,考虑到utf8编码格式下,一个中文占3个字节,问题的原因初步可以断定是数据的存储格类型引起的。然后查阅了Mysql Blob 类型的说明,Blob存储的其实是二进制数据,我们来看看Blob的定义:
BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。BLOB 列被视为二进制字符串(字节字符串)。BLOB列没有字符集,并且排序和比较基于列值字节的数值值。我们再来看看常用的大文本类型Text的定义,这样能有一个对比。
TEXT列被视为非二进制字符串(字符字符串),TEXT列有一个字符集,并且根据字符集的校对规则对值进行排序和比较。
通常Mysql 字符集的配置就告诉了Mysql在执行查询时所呈现的编码格式,就拿Blob中存储的二进制数据举例来说:在mysql 控制台执行查询命令时,控制台自身就帮我们完成了由字节到文本的转换,相应地中文也进行了正常的转换。记得,此处我们强调了mysql控制台,或者说就是我们常用的shell命令,mysql -u *** -p 脚本执行的控制台环境。字节——文本的转换Mysql 控制台按照utf8的编码格式进行了转换。 这也是为什么我们登陆到mysql服务后,mysql -u *** -p 登陆mysql服务器后,执行查询脚本的到正常数据的原因。
那么为什么通过程序连接mysql返回的结果不对呢,是因为java程序连接mysql执行查询后,Blob类型本身是没有字符集的,也就不会做根据字符集的校对,所以java连接mysql执行查询返回的Byte[]字节数组是没有经过任何字符集校队的,即便你存入Blob的数据本身就是符合utf8编码格式的,最终得到的结果依然会是乱码,除非你在程序中有相应的处理逻辑。
好了,到这终于解决了中文乱码展示的问题,同时也明白了乱码出现的原因。对Blob类型的认识也更加深刻。
小提示:如果你的BLOB中存储的数据原本就是符合utf8编码格式的,同时你的数据库以及数据表的编码格式的符合utf8,那么字段类型由BLOB变更为Text类型时,数据时可是保证正常转换的,当然,别忘记了字段长度要保持一个量级。这个我自己测试了下,没有问题。
着重基础之—MySql Blob类型和Text类型的更多相关文章
- 【Mysql】Mysql Json类型或Text类型可以建索引吗?
一.JSON类型 答案是不可以 为Json类型建索引会报错 mysql)); ERROR (): JSON column 'card_pay_data' cannot be used in key s ...
- [mysql]MySql数据类型和java类型对照表
MySQL Type Name Return value ofGetColumnClassName Returned as Java Class BIT(1) (new in MySQL-5.0) B ...
- MySql Int 类型和 varchar类型进行比较。
今天遇到个比较奇葩的问题,简单讲就是在Mysql中进行查询的时候 在Where语句中使用的int类型的字段和Varchar类型的字段进行对比. 例如:我这有一张表: 表中的数据如下: 当我进行查询的时 ...
- JS基础_数据类型-Null类型和Undefined类型
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Java Blob类型和String类型相互转换
1.String 转 Blob: String content = "Hello World!"; Blob blob = Hibernate.createBlob(content ...
- 着重基础之—MySql 不能遗忘的索引操作
着重基础之—MySql 不能遗忘的索引操作 关于MySql索引的基础知识我就不在这里写了,我不太想当信息的搬运工. 技巧分享:Workbench 作为一款专为MySQL设计的ER/数据库建模工具.除了 ...
- Date类型和Long类型的相互转换
Date类型和Long类型的相互转换: import java.text.SimpleDateFormat; import java.util.Date; public class T { publi ...
- java中XMLGregorianCalendar类型和Date类型之间的相互转换
import java.text.SimpleDateFormat;import java.util.Date;import java.util.GregorianCalendar;import ja ...
- MIME类型和Java类型
MIME类型和Java类型 类型转换Spring Cloud Stream提供的开箱即用如下表所示:“源有效载荷”是指转换前的有效载荷,“目标有效载荷”是指转换后的“有效载荷”.类型转换可以在“生产者 ...
随机推荐
- Spring boot profile 多环境配置
1.多Profile文件 我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml 默认使用application.properties的配置 ...
- arguments.callee 属性 递归调用 & caller和callee的区别
arguments.callee 在函数内部,有两个特殊的对象:arguments 和 this.其中, arguments 的主要用途是保存函数参数, 但这个对象还有一个名叫 callee 的属 ...
- 行矩阵列矩阵D3D&GL&U3D
void Start () { //矩阵函数原型:Matrix4x4(Vector4 colum0, Vector4 colum1, Vector4 colum2, Vector4 colum3),这 ...
- 一步步实现 easyui datagrid表格宽度自适应,效果非常好
一步步实现 easyui datagrid表格宽度自适应,效果非常好: 一.设置公共方法,使得datagrid的属性 fitColumns:true $(function(){ //初始加载,表格宽 ...
- Eclipse中spring项目的XML文件的问题
XML文件提示Start state definition is missing. Add a 'start-state' element 原因:Eclipse 认为 XML 是“Spring Web ...
- Spinnaker 介绍
功能: 无论目标环境如何,Spinnaker 部署优势始终如一,它的功能如下: 通过灵活和可配置 Pipelines,实现可重复的自动化部署: 提供所有环境的全局视图,可随时查看应用程序在其部署 Pi ...
- 这两天的刷机+Root
最近为了研究Xposed框架的搭建使用,将自己红米Note2尝试root后,开不了机了.后使用(网上下载的线刷宝,刷的官网线刷宝成功开机了,然后里面会自带很多软件,然后通过下载KingRoot将手机自 ...
- Ubuntu下Eclipse热键Ctrl+Alt+Up无效的解决
原文链接 :http://rox.iteye.com/blog/875078 现在好多链接都打不开了, Ubuntu下一直用NetBeans开发,改了热键为Eclipse的,复制行不管用,一直认为是N ...
- EasyUI 修改
<script type="text/javascript"> <!-- js --> /*=============================修改对 ...
- mysql开通tcp远程连接
1.登陆mysql: mysql -u root mysql 2.运行下面命令 UPDATE `mysql`.`user` SET `Host` = '%' WHERE `user`.`Host` = ...