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,你就用这个翻译就行了。