MYSQL数据查询技巧
2019-06-04山东李瑞祥刘伟
■ 山东 李瑞祥 刘伟
编者按:笔者在通过MYSQL数据做数据业务统计时,遇到了一些问题,但通过查询资料,反复摸索,问题得以解决。下面本文将选择有代表性的问题详细说明解决方法。
最近一段时间我们一直通过MYSQL数据做一项数据业务统计工作,经常需做一些诸如将EXCLE或CSV格式的文件导入MYSQL数据,然后进行诸如数据关联等的操作,在这个过程中我们遇到了一些问题,但都通过查询资料,反复摸索解决了,下面选取三个比较有代表性的问题说一下解决方法。
图1 查看字符集
无法插入中文数据的解决方法
这个问题的发现是启用一台新的MYSQL服务器时发现的,之前我们在一台老的MYSQL服务器进行数据导入时一切正常,只是当需要统计的数据量越来越大的时候,老的MYSQL服务器的硬件性能跟上不了,我们就启用了一台新的MYSQL服务器,这台服务器的硬件性能要远远高于旧服务器,理论上运行数据统计的速度要远远高于旧服务器,但是在导入数据的时候就出现了故障,无论是导入EXCEL格式还是CSV格式的数据,发现导入到数据库中的表中的数据都是空的。通过仔细看导入时生成的日志文件,发现都是导入一个名为“所属OLT名称”的那一列数据时出现了问题,再经过反复比较,我们发现只有这一列的内容是有汉字的,那么故障的原因很有可能就是新的MYSQL数据库不支持中文。这个判断通过登录数据库,运行查看字符集的编码格式得到了验证,如图1所示。
可以看到charact er_set_database和character_set_server这两个字符集的编码格式都是“latin1”,这时就需要更改这两项的编码格式,通过修改/etc下的my.cnf文件即可,在[mysqld]的内容中添加如下一行:[mysqld]
#
c h a r a c t e r_s e t_server=utf8
然后再重启mysqld进程,就会发现编码格式改过来了,如图2所示。
确定完MYSQL对汉字的支持以后,再进行导入数据的操作,不论是EXCEL格式还是CSV格式就都可以顺利的完成了。
图2 具体内容
图3 具体内容
依次对数据表中的字符串进行替换操作
这是一个什么需求呢?即我们为了在MYSQL中进行不同表之间的数据关联,就必然要对表格中的数据进行一些规范操作,比如在“网元名称”这一列中,我们只需要保留数字和“/”这一个分隔符,其它的像“ONU ”、“(---)”这样的符号都需要去掉,这个操作在WPS表格中也可以完成,但一项一项的去做太麻烦了,在MYSQL中利用REPLACE函数可以方便的完在,即写多条REPLACE命令来实现,如图3所示。
可以看到REPLACE命令是支持嵌套的,但是相当复杂,其实一条指令实现一个替换即可,注意每条指令的最后加一个分号,就可以了。
通过对比发现,特别针对大数据进行操作,MYSQL的速度要高于WPS表格或EXCEL表格,这也是我们选择在MYSQL中进行数据项的规范性操作的另一个原因。
老是出现的ORDER BY错误提示的解决方法
当数据导入正常、各项数据操作也可以正常进行得到相应结果的时候,却发经常出现一个报错,如下所示:
[Err] 1055 -Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column"i n f o r m a t i o n_schema.PROFILING.S E Q" w h i c h i s not functionally dependent on columns in GROUP BY clause;this is incompatible with sql_mode=only_full_group_by
通过仔细分析这个错误提示,我们找到了解决办法同样是编辑/etc下面的my.cnf文件,添加如下一行
[mysqld]
#
character_set_server=utf8
sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
然后再重启mysql服务即可。这样操作以后,这种类型的错误就不出现了。