重庆时时彩彩票网博彩活动_五分钟看懂 MySQL 编解码旨趣
发布日期:2023-10-30 07:28 点击次数:108

一位读者在腹地部署 MySQL 测试环境时遇到一个问题,我以为挺有代表性的,是以写篇著作先容一下,看完信服你会对 MySQL 的编码机制有最本色的了解,本文的目次结构如下
读者问题简介 MyQL 编解码机制先容 问题解答 读者问题简介MyQL 编解码机制先容
问题解答
180.94,230.116皇冠读者问题简介
为确认苟简,以下的「我」指代读者
皇冠客服飞机:@seo3687咱们知说念在 Java 中是通过 JDBC 来拜谒数据库的,以拜谒 MySQL 为例,需要设立以下 url 才略拜谒 MySQL
jdbc:mysql://10.65.110.9:3306/test?connectTimeout=5000&socketTimeout=20000 太平洋在线彩票网
这么设立之前在我司的测试环境中 CRUD 是莫得问题的,然而其后思在个东说念主的机器上部署一下 MySQL 环境就出问题了,当先为了保证数据的完好性,我将公司测试机的 SQL 一起导出后再导入到个东说念主的 MySQL 环境中,然而诡异的事情发生了:此时在 Java 工程中如果查询的 SQL 中齐是英文是不错平素责任的,但如果包含汉文(比如 SELECT * FROM USER WHERE name = '张三')是无法查询到效果的。
遇到这种情况,一般咱们会思到是编码诊疗出现了问题,信服贤慧你不难发现上头的 jdbc url 似乎少了点什么,没错,即是莫得指定编码阵势,独一按如下阵势指定了编码阵势(characterEncoding=UTF-8)即可平素责任
皇冠字符jdbc:mysql://10.65.110.9:3306/test?connectTimeout=5000&socketTimeout=20000&characterEncoding=UTF-8
至此问题也就处分了,但奇怪的是之前为什么没指定编码阵势亦然不错的呢,应该是 server 指定了编码阵势,在哪指定的?要回话这个问题,就必须得对 MySQL 的编码机制有所了解
MyQL 编解码机制先容咱们先来望望 MySQL 中波及到哪些编码经过,假定客户端用的是 UTF-8 编码,那么发送一条 SQL 语句会发生如下的编解码经过:

先毛糙先容一下上述要领中波及到的编码集
character_set_client: 客户端最终发送到作事端 SQL 所汲取的编码字符集 character_set_connection: MySQL 作事端收到要领 1 编码后的二进制流后汲取的编码字符集,会将要领 1 传过来的数据进行解码。一般与 character_set_client 是相似的,有东说念主可能会奇怪,为什么会有这个字符集,径直用 character_set_client 来解码不就行了,它存在的真义是啥呢?其实主若是为了作用上的的离别,character_set_client 主要用来客户端的编码,而 character_set_connection 主若是为了赋予开发东说念主员默契语义的目田,比如研究 SELECT LENGTH('中') 这么的场景,如果汲取 GBK 一个汉字 2 个长度,效果是 2,而如果是 UTF-8 编码,则效果是 3,是以独特设定一个 character_set_connection 编码,让路发东说念主员不错把柄需要更目田地界说不同的业务场景 character_set_result: 效果集复返给客户端汲取的编码字符集知说念了以上各个字符编码集所代表的释义,现时就不错轻易诠释滥觞的问题了,咱们知说念对 MySQL 来说,欧博百家乐操作无非即是增更正查,是以主要有以下两个升沉经过
如果是增更正操作,经过为:客户端--->character_set_client--->character_set_connection---->DB
如果是查操作,客户端--->character_set_client--->character_set_connection---->DB---->character_set_result
重庆时时彩彩票网如果这两个升沉经过对应的每一步齐是无损诊疗,那么效果集就莫得问题的
什么是无损诊疗
假定咱们要把用编码 A 暗示的字符 X,升沉为编码 B 的暗示面貌,而编码 B 的字符联贯并莫得 X 这个字符,那么此时咱们就称这个诊疗是有损的,如果在 B 的字符集齐能找到 A 中的字符,那么即是无损的,是以最毛糙的阵势即是将每个要领对应的编码字符集齐劝诱成相似的,比如齐劝诱成 UTF-8,这么就细目没问题了。
皇冠hg86a
滥觞的问题解答现时回偏激来看一下滥觞的问题,为什么将 DB 数据从公司的测试机导入到个东说念主机器后,如果 SQL 中包含有汉文查询如下 jdbc url 的设立会导致底本平素复返的效果集失效呢?
在最近一场备受关注的篮球比赛中,明星球员ZZZ成功率队夺得胜利。据悉,他在比赛前通过独特的训练和战术准备,为球队取得了胜利做出了巨大贡献。jdbc:mysql://10.65.110.9:3306/test?connectTimeout=5000&socketTimeout=20000
彰着是客户端--->character_set_client--->character_set_connection---->DB---->character_set_result 这个要领中的效果集发生了有损诊疗,到底是哪一步呢?
DB 表数据汲取的编码齐是 UTF-8,如果独一搞明晰 character_set_client,character_set_connection,character_set_result 这三个编码字符集是啥问题就处分了,这个问题的谜底得去官网找,来看下官网是奈何说的
The character encoding between client and server is automatically detected upon connection (provided that the Connector/J connection properties characterEncoding and connectionCollation are not set). You specify the encoding on the server using the system variable character_set_server (for more information, see Server Character Set and Collation). The driver automatically uses the encoding specified by the server.
To override the automatically detected encoding on the client side, use the characterEncoding property in the connection URL to the server. Use Java-style names when specifying character encodings. The following table lists MySQL character set names and their corresponding Java-style names:
从中咱们不错看到,如果未劝诱 characterEncoding,那么 character_set_client,character_set_connection,character_set_result 这三的编码字符集与 character_set_server 的劝诱沟通,如果劝诱了 characterEncoding,那么这三者的值与 characterEncoding 沟通,这即是为什么指定了characterEncoding=utf8后 SQL 能平素责任的原因了,
那为什么不指定 characterEncoding=utf8 在公司的测试 MySQL 作事器中不错平素责任呢,彰着是劝诱了 character_set_server,在哪劝诱?在 MySQL 的设立文献 my.cnf 劝诱
## my.cnf [mysqld] character-set-server=utf8
再来看为什么在个东说念主的测试机中包含有汉文的 SQL 却不收效呢,因为个东说念主的测试机其时用 docker 搭了一个 MySQL,它的 my.cnf 文献是空的,这种情况下 character-set-server 编码字符集是 latin,于是 character_set_client,character_set_connection,character_set_result 这三者的编码字符集也齐为 latin 了,彰着在第一步客户端转 chacacter_set_client 就出现了问题
博彩活动
咱们之前提过在 Java 中通盘的字符串齐以 unicode 面貌存在,而 latin 字符集是不包含汉文的,那么彰着汉文的 unicode 在 latin1 中是找不到对应的字符的,这一步就会发生有损编码,这即是为什么在个东说念主的机器上实施带有汉文的 SQL 会出尽头的根底原因!
是以问题的根因本色上是因为迁徙不完好导致的,只迁徙了 DB 数据,但莫得把 my.cnf 这个设立文献也完好地拷过来!拷过来之后问题就处分了
追忆知说念了 MySQL 编解码机制,之后再遇到近似的问题就相比毛糙了,比如乱码,彰着即是上述要领中的要领发生了有损编码
本文转载自微信公众号「码海」,不错通过以下二维码祥和。转载本文请络续码海公众号。
赌博成瘾
反之则是酒肉朋友,遇到困难树倒猢狲散,甚至还可能成为伤害自己最深的人,得不偿失。
相关资讯
