php脚本l导出mysq的blob格式数据-hex和unhex的用法
前言
之前我们介绍过使用PHP脚本导出sql语句到测试服中的流程和注意点, 之前有个问题还没有解决的,就是mysql中blob类型数据是导不成功的。 这次找到了解决方法,这里记录一下。
什么是blob类型?
我们在【mysql常用数据类型中】介绍过了blob类型,这里也说一下: 在MySQL中,Blob是一个二进制的对象,它是一个可以存储大量数据的容器(如图片,音乐等等),且能容纳不同大小的数据。 在MySQL中有四种Blob类型,他们的区别就是可以容纳的信息量不容分别是以下四种:
①TinyBlob类型 最大能容纳255B的数据
②Blob类型 最大能容纳65KB的
③MediumBlob类型 最大能容纳16MB的数据
④LongBlob类型 最大能容纳4GB的数据
场景
我们的一个表有个字段的数据是存储了一些会员信息,这些信息是由几个字段组成,然后json_encode 并且压缩后存储在字段类型为blob的字段中,这些信息以blob格式存储在数据库中,直接用sql查询出来都是乱码,无法显示,不信你可以尝试查询下。
当我们导出成sql语句时,如果不做特殊处理,这些字段也会是乱码,会导致sql结构破坏掉,不能完整执行。
解决方案 找了下资料,发现mysql有两个函数,是可以格式化这些二进制数据的。 下面是两个函数的介绍
HEX 和UNHEX 建议先看一下官方免费手册中的说明。
HEX(NorS)
If NorS is a number, returns a string representation of the hexadecimal value of N, where N is a longlong (BIGINT) number. This is equivalent to CONV(N,10,16).
翻译:如果NorS是数字,则返回十六进制值N的字符串表示,其中N是longlong(BIGINT)数字。 这相当于CONV(N,10,16)。
If NorS is a string, returns a hexadecimal string representation of NorS where each character in NorS is converted to two hexadecimal digits. The inverse of this operation is performed by the UNHEX() function.
翻译:如果NorS是字符串,则返回NorS的十六进制字符串表示形式,其中NorS中的每个字符都转换为两个十六进制数字。 此操作的反转由UNHEX()函数执行。
mysql> SELECT HEX(255);-> 'FF'mysql> SELECT 0x616263;-> 'abc'mysql> SELECT HEX('abc');-> 616263
UNHEX(str)
Performs the inverse operation of HEX(str). That is, it interprets each pair of hexadecimal digits in the argument as a number and converts it to the character represented by the number. The resulting characters are returned as a binary string.
翻译:执行HEX(str)的逆操作。 也就是说,它将参数中的每对十六进制数字解释为数字,并将其转换为数字表示的字符。 结果字符作为二进制字符串返回。
mysql> SELECT UNHEX('4D7953514C');-> 'MySQL'mysql> SELECT 0x4D7953514C;-> 'MySQL'mysql> SELECT UNHEX(HEX('string'));-> 'string'mysql> SELECT HEX(UNHEX('1267'));-> '1267'
The characters in the argument string must be legal hexadecimal digits: '0' .. '9', 'A' .. 'F', 'a' .. 'f'. If UNHEX() encounters any nonhexadecimal digits in the argument, it returns NULL:
翻译:参数字符串中的字符必须是合法的十六进制数字:'0'..'9','A'..'F','a'..'f'。 如果UNHEX()在参数中遇到任何非十六进制数字,则返回NULL:
mysql> SELECT UNHEX('GG');+-------------+| UNHEX('GG') |+-------------+| NULL |+-------------+
A NULL result can occur if the argument to UNHEX() is a BINARY column, because values are padded with 0x00 bytes when stored but those bytes are not stripped on retrieval. For example 'aa' is stored into a CHAR(3) column as 'aa ' and retrieved as 'aa' (with the trailing pad space stripped), so UNHEX() for the column value returns 'A'. By contrast 'aa' is stored into a BINARY(3) column as 'aa\0' and retrieved as 'aa\0' (with the trailing pad 0x00 byte not stripped). '\0' is not a legal hexadecimal digit, so UNHEX() for the column value returns NULL.
翻译:如果UNHEX()的参数是BINARY列,则可能会出现NULL结果,因为在存储时会使用0x00字节填充值,但这些字节在检索时不会被剥离。 例如,'aa'作为'aa'存储在CHAR(3)列中,并作为'aa'检索(尾随填充空间被剥离),因此列值的UNHEX()返回'A'。 相比之下,'aa'作为'aa \ 0'存储在BINARY(3)列中,并作为'aa \ 0'检索(尾随填充0x00字节未被剥离)。 '\ 0'不是合法的十六进制数字,因此列值的UNHEX()返回NULL。
综上,简单点理解就是
导出时采用HEX函数读取数据,把二进制的数据转为16进制的字符串;
select HEX(binField) from testTable;//查询出来的数据是一串可以展示的字符串,可以导出为sql语句,//但是要恢复,要是用其逆转函数UNHEX将数据格式化导入
//导入时采用UNHEX函数,把16进制的字符串转为二进制的数据导入库中;insert into testTable binField values(UNHEX(@hexstr));//这样格式化后,可以完整的将数据导进去。
php脚本l导出mysq的blob格式数据-hex和unhex的用法的更多相关文章
- 记录几种有关libsvm格式数据的list和dict用法
# list元素求和 sum = reduce(lambda x,y: x+y, mylist) # 比较两个 lists 的元素是否完全一致 if all(x==y for x, y in zip( ...
- Mongodb 导出json 和csv 格式数据
导出到json: $ mongoexport.exe -d TestDB -c TestCollection -o ./test.json 导出到csv: If you want to outpu ...
- Asp.net导出Excel/Csv文本格式数据
刚刚开始做Excel相关的项目,所以遇到的问题不管大小都给记录一下 偶然的机会在添加数据的时候全改成了数字,结果输出的时候全自动变成了科学计数法,这是excel的强大功能,能自动识别数字和字符串,太聪 ...
- 基于PLSQL的数据库备份方法及如何解决导出clob和blob类型数据报错的问题
基于PL/SQL的数据库备份方法 PL/SQL Developer是Oracle 数据库中用于导入或导出数据库的主要工具,本文主要介绍了利用PL/SQL Developer导入和导出数据库的过程,并对 ...
- Unity3D Asset文件导出3DMax 可编辑格式
本文章由cartzhang编写,转载请注明出处. 全部权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/60878354 作者:car ...
- ArcEngine地图窗口指定区域导出指定DPI多格式---delphi/C#实现
delphi/C#实现,其他语言稍微改下就行了.AE的编码各个语言都差不多,这里也没用到某一语言的特性. 函数特点: 1.可以精确导出指定范围的图形要素 2.支持多格式.TIF, .EMF,.GIF, ...
- TensorFlow 自定义模型导出:将 .ckpt 格式转化为 .pb 格式
本文承接上文 TensorFlow-slim 训练 CNN 分类模型(续),阐述通过 tf.contrib.slim 的函数 slim.learning.train 训练的模型,怎么通过人为的加入数据 ...
- import 语句用于导入从外部模块,另一个脚本等导出的函数,对象或原语。
import 语句用于导入从外部模块,另一个脚本等导出的函数,对象或原语. 注意:此功能目前无法在任何浏览器中实现.它在许多转换器中实现,例如 Traceur Compiler , Babel , R ...
- Bash中使用MySQL导入导出CSV格式数据[转]
转自: http://codingstandards.iteye.com/blog/604541 MySQL中导出CSV格式数据的SQL语句样本如下: select * from test_inf ...
随机推荐
- Window权限维持(八):时间服务器
Windows操作系统正在利用时间提供者体系结构,以便从网络中的其他网络设备或客户端获取准确的时间戳.时间提供者以DLL文件的形式实现,该文件位于System32文件夹中.Windows启动期间将启动 ...
- Maven配置教程详解
Maven的安装与配置 一.在https://www.cnblogs.com/zyx110/p/10799387.html中下载以下maven安装包 解压缩即可 根据你的安装路径配置maven环境变量 ...
- UITableView与UITableViewCell
转自:http://blog.sina.com.cn/s/blog_4cd14afb01014j97.html UITableView用来以表格的形式显示数据.关于UITableView,我们应该注意 ...
- QLineEdit默认提示 setPlaceholderText
Setting this property makes the line edit display a grayed-out placeholder text as long as the text( ...
- 章节十四、3-执行JavaScript命令
一.网页页面都是由html+css和javaScript组成的,如果页面中没有javaScript的存在,就不会有操作动作的执行,例如页面上你点击的按钮或者链接都离不开javaScript.(这一节不 ...
- 【原创】Airflow 简介&如何部署一个健壮的 apache-airflow 调度系统
声明 本文摘录了很多前辈的文章,原文如下: https://www.jianshu.com/p/2ecef979c606 Airflow 简介 Airflow是一个可编程,调度和监控的工作流平台,基于 ...
- mycat原理及分表分库入门
1.什么是MyCat: MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原 ...
- [TCP/IP] TCP如何保证可靠性
1.数据包校验,发送方计算校验和,接收方结算校验和,进行对比2.应答机制,seq序列号与ack确认号 3.超时重传机制,发送后启动定时器,进行重传 4.连接管理,三次和四次5.对失序数据包重排序6.流 ...
- 6、Routing
Routing In the previous tutorial we built a simple logging system. We were able to broadcast log mes ...
- 服务器学习--Linux、CentOS下安装zip与unzip指令
Linux下安装zip解压功能 Linux服务器上一般默认没是没有有安装zip命令 安装zip指令 apt-get install zip 或 yum install zip 输入zip OK li ...