mysql字符集理解

mysql字符集

mysql的字符集设置项非常多,经常让人感觉无所适从,如下:

  • character_set_client    utf8
  • character_set_connection    utf8
  • character_set_database    utf8mb4
  • character_set_filesystem    binary
  • character_set_results    utf8
  • character_set_server    utf8
  • character_set_system    utf8
     

都是干嘛的

那么这些选项一个个都是干嘛的呢?现在以一次请求流程为例,说说每一项都是干嘛的:

首先这些设置,都是针对服务端的,是服务端的配置。

character_set_client: 是告诉server,client端传过来的sql语句的二进制是用utf8编码的。那么当通过网络接收到二进制后,server就用该编码集进行解析。

character_set_connection: 是告诉server,从client拿到的sql要进行转换的字符编码,server将拿到的sql再进行一次转换。(至于为什么转换?,既然已经知道client字符编码和知道表中数据的字符编码,就可以crud了,为什么还要一个connection设置呢?我的理解应该是应对这种查询,select "haha" < "hehe",这种是不涉及到表的操作,此时比较时需要的字符编码和排序比较方式可能是和client要求是不一样的,这时就统一做了一层转换)

character_set_server /character_set_database:这是定义sql服务器,数据库的默认字符编码,如果表中字段没有指定字符集,就用默认的字符集。

character_set_results :是告诉服务器,返回查询/操作结果,用的字符编码,将结果集用该字符编码编成二进制返回给client。

character_set_system:这个是设置sql服务端元数据的编码集,比如字段名称,就用该编码集进行转码。

实际应用

当然这都是sql server的配置,这就是默认,如果不指定,那就按这个配置来,如果你的某次连接进行了指定,那么就会覆盖这个默认的配置项,比如当我们配置mysql数据源的时候,会有如下内容:

jdbc:mysql://18.18.100.222:3306/music?characterEncoding=UTF-8&useSSL=false&tinyInt1isBit=false

此处的characterEncoding就是设置的character_set_client内容,当建立连接的时候,会告诉server:hey,大哥,我用的是utf8哦,凡是小弟发送过来的sql,你就用这个翻译就行了。

猜你喜欢

转载自blog.csdn.net/dshf_1/article/details/89672466