MySQL字符集乱码及解决方案分享
前言
字符集是一套符号和编码的规则,不论是在oracle数据库还是在mysql数据库,都存在字符集的选择问题,而且如果在数据库创建阶段没有正确选择字符集,那么可能在后期需要更换字符集,而字符集的更换是代价比较高的操作,也存在一定的风险,所以,我们推荐在应用开始阶段,就按照需求正确的选择合适的字符集,避免后期不必要的调整。
实战
1、安装MySQL数据库
2、乱码演示
mysql>showvariableslike'character_set%'; +--------------------------+----------------------------------+ |Variable_name|Value| +--------------------------+----------------------------------+ |character_set_client|utf8| |character_set_connection|utf8| |character_set_database|utf8| |character_set_filesystem|binary| |character_set_results|utf8| |character_set_server|utf8| |character_set_system|utf8| |character_sets_dir|/usr/local/mysql/share/charsets/| +--------------------------+----------------------------------+ 8rowsinset(0.00sec) mysql>insertintotest.table10values(1,'云中鹤'); QueryOK,1rowaffected(0.00sec) mysql>select*fromtest.table10; +------+-----------+ |id|names| +------+-----------+ |1|云中鹤| +------+-----------+ 1rowinset(0.00sec) mysql>setnameslatin1; QueryOK,0rowsaffected(0.00sec) mysql>select*fromtest.table10; +------+-------+ |id|names| +------+-------+ |1|???| +------+-------+ 1rowinset(0.00sec) mysql>showvariableslike'character_set%'; +--------------------------+----------------------------------+ |Variable_name|Value| +--------------------------+----------------------------------+ |character_set_client|latin1#客户端来源数据使用的字符集 |character_set_connection|latin1#连接层字符集 |character_set_database|utf8#当前选中数据库的默认字符集 |character_set_filesystem|binary |character_set_results|latin1#查询结果字符集| |character_set_server|utf8#默认的内部操作字符集| |character_set_system|utf8#系统元数据(字段名等)字符集 |character_sets_dir|/usr/local/mysql/share/charsets/| +--------------------------+----------------------------------+ 8rowsinset(0.00sec)
乱码解决办法
从上面可以看出,setnameslatin1;改变了三个参数..只要做到客户端,MySQLcharacter-set-client,tablecharset三个字符集完全一致就可以保证一定不会有乱码出现。
方式:
1、在mysql命令行模式下执行setnamesxxx;
mysql>setnamesutf8; QueryOK,0rowsaffected(0.01sec)
2、登录mysql的时候指定默认字符集
[root@node1~]#mysql-S/tmp/mysql.sock4--defaults-character-set=utf8#-S指定多实例mysql的套接字文件, 使用--defaults-character-set指定默认字符集。
3、修改/etc/sysconfig/i18n文件,在my.cnf不指定默认字符集的情况下。
vim/etc/sysconfig/i18n LANG='zh_CN.UTF-8'#如果my.cnf不指定,默认使用系统字符集
4、 修改my.cnf文件,下面两个字段在任意一个字段都是可以的。
[client] default-character-set=latin1
[mysql] default-character-set=latin1
前两种1,2是临时解决方案,后面两种3,4是永久有效的方案
查看字符集
1、查看系统当前字符集设置,修改之后登陆mysql执行。showvariableslile'character_set%';
mysql>showvariableslike'character_set%';#我修改的为utf8,所以客户端的三个参数都是utf8.你可以自行设置字符集。 +--------------------------+----------------------------------+ |Variable_name|Value| +--------------------------+----------------------------------+ |character_set_client|utf8| |character_set_connection|utf8| |character_set_database|utf8| |character_set_filesystem|binary| |character_set_results|utf8| |character_set_server|utf8| |character_set_system|utf8| |character_sets_dir|/usr/local/mysql/share/charsets/|
2、mysql常用字符集。执行命令showcharacterset;查看系统支持字符集。
mysql>showcharacterset; +----------+-----------------------------+---------------------+--------+ |Charset|Description|Defaultcollation|Maxlen| +----------+-----------------------------+---------------------+--------+ |big5|Big5TraditionalChinese|big5_chinese_ci|2| |dec8|DECWestEuropean|dec8_swedish_ci|1| |cp850|DOSWestEuropean|cp850_general_ci|1| |hp8|HPWestEuropean|hp8_english_ci|1| |koi8r|KOI8-RRelcomRussian|koi8r_general_ci|1| |latin1|cp1252WestEuropean|latin1_swedish_ci|1|#常用 |latin2|ISO8859-2CentralEuropean|latin2_general_ci|1| |swe7|7bitSwedish|swe7_swedish_ci|1| |ascii|USASCII|ascii_general_ci|1| |ujis|EUC-JPJapanese|ujis_japanese_ci|3| |sjis|Shift-JISJapanese|sjis_japanese_ci|2| |hebrew|ISO8859-8Hebrew|hebrew_general_ci|1| |tis620|TIS620Thai|tis620_thai_ci|1| |euckr|EUC-KRKorean|euckr_korean_ci|2| |koi8u|KOI8-UUkrainian|koi8u_general_ci|1| |gb2312|GB2312SimplifiedChinese|gb2312_chinese_ci|2| |greek|ISO8859-7Greek|greek_general_ci|1| |cp1250|WindowsCentralEuropean|cp1250_general_ci|1| |gbk|GBKSimplifiedChinese|gbk_chinese_ci|2|#常用 |latin5|ISO8859-9Turkish|latin5_turkish_ci|1| |armscii8|ARMSCII-8Armenian|armscii8_general_ci|1| |utf8|UTF-8Unicode|utf8_general_ci|3|#常用 |ucs2|UCS-2Unicode|ucs2_general_ci|2| |cp866|DOSRussian|cp866_general_ci|1| |keybcs2|DOSKamenickyCzech-Slovak|keybcs2_general_ci|1| |macce|MacCentralEuropean|macce_general_ci|1| |macroman|MacWestEuropean|macroman_general_ci|1| |cp852|DOSCentralEuropean|cp852_general_ci|1| |latin7|ISO8859-13Baltic|latin7_general_ci|1| |utf8mb4|UTF-8Unicode|utf8mb4_general_ci|4|#常用 |cp1251|WindowsCyrillic|cp1251_general_ci|1| |utf16|UTF-16Unicode|utf16_general_ci|4| |cp1256|WindowsArabic|cp1256_general_ci|1| |cp1257|WindowsBaltic|cp1257_general_ci|1| |utf32|UTF-32Unicode|utf32_general_ci|4| |binary|Binarypseudocharset|binary|1| |geostd8|GEOSTD8Georgian|geostd8_general_ci|1| |cp932|SJISforWindowsJapanese|cp932_japanese_ci|2| |eucjpms|UJISforWindowsJapanese|eucjpms_japanese_ci|3| +----------+-----------------------------+---------------------+--------+ 39rowsinset(0.00sec)
字符集选择
1、如果处理各种各样的文字,发布到不同语言国家地区,选择Unicode。,对mysql对号utf-8。
2、只需中文,数据量很大,性能要求也高,选择gbk.。
3、处理移动物联网业务,选utf8mb4
建议在能够完全满足应用的前提下,尽量使用小的字符集。因为更小的字符集意味着能够节省空间、减少网络传输字节数,同时由于存储空间的较小间接的提高了系统的性能。
服务器字符集设置
[mysqld] ... character-set-server=utf8#添加这条语句,可设置服务器端字符集。
mysql服务端重新启动后,这两个参数会改变为设定值。
|character_set_server|utf8 |character_set_database|utf8
切换字符集
将一种编码的数据库转换为另一种编码的数据。
alterdatabasedbnamecharactersetxxx;#只能对以后的数据有效,对之前的数据无效。基本不使用
常用转换数据库字符集方案
mysqldump-S/tmp/mysql.sock4--default-character-set=utf8-dtest>/data/test-`date+%F`.sql#1、导出表结构而不导出数据 vim/data/test-`date+%F`.sql DROPTABLEIFEXISTS`table10`; /*!40101SET@saved_cs_client=@@character_set_client*/; /*!40101SETcharacter_set_client=utf8*/; CREATETABLE`table10`( `id`int(11)DEFAULTNULL, `names`char(20)DEFAULTNULL )ENGINE=InnoDBDEFAULTCHARSET=utf8;#2、这里的CHARSET改为你想要修改的字符集 mysqldump-S/tmp/mysql.sock4--extended-insert--no-create-infotest>/data/test-data-`date+%F`.sql#3、导出数据内容 vim/data/test-data-`date+%F`.sql LOCKTABLES`table10`WRITE; setnamesutf8;#4、这一行是多加的,自己指定想要转换的字符集 INSERTINTO`table10`VALUES(1,'云中鹤'); UNLOCKTABLES; mysql>createdatabaseifnotexiststest;#5、创建数据库,存储转换后的数据 QueryOK,1rowaffected,0warning(0.00sec) mysql-S/tmp/mysql.sock4test最后
这是在15年的时候,自己学习MySQL的笔记,今天再拿出来分享下
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。