MySQL编码不一致可能引起的一些问题
存储过程与编码
MySQL存储过程中,表和数据的编码与数据库和存储过程默认的编码不同则可能出现sql不会使用索引的情况,因为MySQL会对条件列的数据做相应的编码转换,比如以下,表数据为latin1,MySQL解析器会做一些转换:
...WHEREnamecolumn=NAME_CONST('in_namecolumn',_utf8'MP201022'COLLATE'utf8_general_ci')
可以在存储过程中进行相应的编码转换(通常修改varchar/char字段)使得可以正常使用索引,更多见:mysql-slow-when-run-as-stored-proc
...WHEREnamecolumn=convert(in_namecolumnusinglatin1)collatelatin1_swedish_ci
jdbc直连执行sql
通过jdbc连接执行sql的时候,如果编码不一致,同样需要对varchar,char类型进行转换,如下所示:
...WHEREnamecolumn=convert(in_namecolumnusinglatin1)collatelatin1_swedish_ci
否则可能出现以下编码不一致的错误(随mysql-connector版本不同可能有不同的行为):
SQLstate[HY000]:errorcode[1267]:Illegalmixofcollations(latin1_swedish_ci,IMPLICIT)and(utf8mb4_general_ci,COERCIBLE)foroperation'='
jdbcuseSSL参数变更
在mysql-connector-java配置中,useSSL参数有以下不同,从5.1.38开始useSSL开始按MySQL5.5.45+,5.6.26+or5.7.6+的版本默认开启,对应的requireSSL,verifyServerCertificate两个参数也会跟着开启:
<5.1.38: ConnectionProperties.useSSL=UseSSLwhencommunicatingwiththeserver(true/false),defaultsto'false' >=5.1.38 ConnectionProperties.useSSL=UseSSLwhencommunicatingwiththeserver(true/false),defaultis'true'whenconnectingtoMySQL5.5.45+,5.6.26+or5.7.6+,otherwisedefaultis'false'
MySQL5.7.x及以上的版本,默认会启用ssl,客户端连接的时候会自协商加密,除非显示指定不加密.mysql-connector-java从5.1.38开始默认开启useSSL.所以用低版本jdbc连接MySQL5.7.x不会有加密的问题,用高版本jdbc连接5.7.6+以上会有加密问题,需要显示指定useSSL=false,用高版本的jdbc连接MySQL5.5,5.6不会有加密问题.
到此这篇关于MySQL编码不一致可能引起的一些问题的文章就介绍到这了,更多相关MySQL编码不一致引起的问题内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!