Linux下MySQL的字符集乱码问题总结

前言:

    字符集就是一套文字符号及其编码比较规则的集合。MySQL数据库字符集包括字符集(CHARACTER)和校对规则(COLLATION)两个概念。其中,字符集

用来定义MySQL数据字符串的存储方式。而校对规则是定义比较字符串的方式。不乱码的总体原则是部署的java程序,Linux系统,MySQL客户端,MySQL服务端,

MySQL的某个库,MySQL的某个库下表的字符集统一。


1>java程序中设置:页面中:contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"

request.setCharacterEncoding("utf-8");


2>linux系统查看字符集:

A>查看Linux系统字符集

[root@lll2 /]# cat /etc/locale.conf

LANG="zh_CN.UTF-8"

B>修改Linux系统字符集

[root@lll2 /]# vim /etc/locale.conf


3>MySQL客户端(默认情况下 character_set_client,character_set_connection,character_set_results 会根据你Linux系统设置的字符集,而设置成什么字符集):

A>查看MySQL客户端字符集

mysql> show variables like '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       | /application/mysql-5.5.32/share/charsets/ |

+--------------------------+-------------------------------------------+

8 rows in set (0.03 sec)

B>修改MySQL客户端字符集

[client]


#password= your_password 


port= 3306


socket= /tmp/mysqld.sock


default-character-set=utf8

注意:通过/etc/my.conf下修改MySQL客户端字符集不需要重启MySQL,退出重新登录就生效。


4>MySQL服务端:

A>查看MySQL客户端字符集

mysql> show variables like '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       | /application/mysql-5.5.32/share/charsets/ |

+--------------------------+-------------------------------------------+

B>修改MySQL服务器端字符集

[mysqld]


port= 3306


socket= /tmp/mysqld.sock


character_set_server=utf8

skip-external-locking


character_set_server=utf-8    适用于5.5

#default_character_set=utf-8 适用于5.1及以下

总结:A.通过/etc/my.conf下修改MySQL服务端字符集都需要重启MySQL来生效。

           B.在/etc/my.conf下修改MySQL服务端字符集会修改character_set_server,character_set_database两个参数。     


5>MySQL的某个库( 如果建库时没有指定字符集,则该库会默认使用character_set_server的字符集)

A>查看创建库的字符集

mysql> show create database mysql\G;

*************************** 1. row ***************************

       Database: mysql

Create Database: CREATE DATABASE `mysql` /*!40100 DEFAULT CHARACTER SET utf8 */

1 row in set (0.06 sec)

B>修改库的字符集

alter database mysql character set utf8;


6>MySQL库下的表(如果建表时没有指定字符集则默认使用所属库的字符集,表中的列没有指定字符集默认都使用表的字符集)

A>查看创建表时的字符集

mysql> show create table user\G;

*************************** 1. row ***************************

       Table: user

Create Table: CREATE TABLE `user` (

  `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',

  `User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '',

  `Password` char(41) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',

  `Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Reload_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Shutdown_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Process_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `File_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Show_db_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Super_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Repl_slave_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Repl_client_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Create_user_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `Create_tablespace_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',

  `ssl_type` enum('','ANY','X509','SPECIFIED') CHARACTER SET utf8 NOT NULL DEFAULT '',

  `ssl_cipher` blob NOT NULL,

  `x509_issuer` blob NOT NULL,

  `x509_subject` blob NOT NULL,

  `max_questions` int(11) unsigned NOT NULL DEFAULT '0',

  `max_updates` int(11) unsigned NOT NULL DEFAULT '0',

  `max_connections` int(11) unsigned NOT NULL DEFAULT '0',

  `max_user_connections` int(11) unsigned NOT NULL DEFAULT '0',

  `plugin` char(64) COLLATE utf8_bin DEFAULT '',

  `authentication_string` text COLLATE utf8_bin,

  PRIMARY KEY (`Host`,`User`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges'

1 row in set (0.06 sec)

B>修改表的字符集

alter table user convert to character set utf8;



7>set names latin1背后的原理

mysql> show variables like '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       | /application/mysql-5.5.32/share/charsets/ |

+--------------------------+-------------------------------------------+

8 rows in set (0.01 sec)


mysql> set names latin1;

Query OK, 0 rows affected (0.01 sec)


mysql> show variables like '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       | /application/mysql-5.5.32/share/charsets/ |

+--------------------------+-------------------------------------------+

8 rows in set (0.00 sec)

总结: 

set names latin1就是把上面三个参数改成了latin1。也就是说character_set_client,character_set_connection,character_set_results三者的字符集默认会和

linux系统的字符集一致,但是当在mysql中执行set names字符集操作后,这三者都会改为设置的字符集,但是命令修改时临时生效的。

root@lll2 /]# mysql -u root -p --default-character-set=latin1带字符集登录原理也是临时修改那三个参数。





猜你喜欢

转载自blog.51cto.com/11218855/2283610