设为首页 收藏本站
查看: 226|回复: 0

[经验分享] MySQL 字符集问题

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-1-29 08:14:12 | 显示全部楼层 |阅读模式
MySQL的字符集问题可以归纳为继承问题
可以查看字符集参数例如
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                   客户端字符集
| character_set_connection | latin1                   客户与服务连接采用的字符集
| character_set_database   | utf8                     数据库采用的字符集
| character_set_filesystem | binary                     |
| character_set_results    | latin1                   SELECT查询返回数据的字符集
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

字符集的设置可以卸载mysqld端也可以在client端
可以在my.cnf中设置:
[mysqld]
default-character-set=gbk
或者在启动选项中指定:
mysqld --default-character-set=gbk
或者在编译的时候指定:
./configure --with-charset=gbk

可查看原理部分,如果我用程序插入字符集为utf8的字符,要在mysql客户端正常显示,则需要把character_set_results设置为utf8格式
原理解析:
MySQL存储数据的唯一地方就是列,所以继承的较高层次只有默认值。表的默认字符集不会影响到表里面存储的数据,它只是告诉MySQL在创建列的时候如果没有指定字符集,那么就使用该默认值
在显式地定义字符集的时候,并不需要同时定义字符集和排序规则。
只有基于字符的值才有字符集
其他的任何东西都只是规定使用何种字符集来进行比较或其他操作
基于字符的值可以是存储在列中的值、查询中使用的字面常量、表达式的结果、用户变量等。

MySQL的设置分为下面两类:
  • 创建对象时的默认设置

当创建一个数据库的时候,它从服务器继承了character_set_server
当创建表的时候,它从数据库继承字符集
当创建列的时候,它从表继承字符集

  • 用于客户端/服务器沟通的设置

    • 服务器假设客户端正在按照character_set_client设置的字符集发送数据
    • 服务器从客户端收到语句后,它按照character_set_connection设置的字符集对数据进行翻译,它也会用这个字符集决定如何把数字转换为字符串。
    • 当服务器把结果或错误信息返回客户端时,它会按照character_set_result定义的字符集进行翻译。


使用set names命令,set names实际上就是同时设置了 character_set_client ,character_set_connection和 character_set_results
或者set character set命令按照自己的需要改变上面的3个设置。
但是,这两个命令只会影响服务器的设置。客户端程序和API也需要正确地进行设置,以避免和服务器的沟通问题


注意:
character_set_database的默认值是默认数据库的值。当改变默认数据库的时候,它也会跟着改变。如果没有默认数据库,它的默认值就是character_set_server
LOAD DATA INFILE按照当前character_set_database的设置解释接收到的数据。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-41623-1-1.html 上篇帖子: 备份MySQL数据库的命令 下篇帖子: mysql基于mysql-proxy和amoeba的读写分离以及tcpdump+wireshark工具验证(上)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表