`

mysql字符集问题

阅读更多
character_set_database我原先理解为默认数据库的字符集,也就是使用use database切换到的那个数据库的字符集,不管当前数据库的字符集设置为如何,如果我use DB,这个DB的字符集为UTF8,那么当character_set_database设置为latin1,我use到这个数据库,当在当前数据库创建表如果没有指定字符集,那么该表使用character_set_database设定的字符集,但是下面的实验推翻了我的认识

初始
mysql> show variables like ‘char%’;
+————————–+—————————-+
| Variable_name            | Value                      |
+————————–+—————————-+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+————————–+—————————-+

mysql> create database mymy;show create database mymy;
Query OK, 1 row affected (0.00 sec)

+———-+—————————————————————–+
| Database | Create Database                                                 |
+———-+—————————————————————–+
| mymy     | CREATE DATABASE `mymy` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+———-+—————————————————————–+

改变character_set_server为utf8
mysql> set session character_set_server=utf8;show variables like ‘char%’;
Query OK, 0 rows affected (0.00 sec)

+————————–+—————————-+
| Variable_name            | Value                      |
+————————–+—————————-+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+————————–+—————————-+
8 rows in set (0.00 sec)

mysql> drop database mymy;create database mymy;show create database mymy;
Query OK, 0 rows affected (0.01 sec)

Query OK, 1 row affected (0.00 sec)

+———-+—————————————————————+
| Database | Create Database                                               |
+———-+—————————————————————+
| mymy     | CREATE DATABASE `mymy` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+———-+—————————————————————+
1 row in set (0.00 sec)

是的character_set_server正如我所想的一样,下面看一下character_set_database

mysql> use mymy;create table tt1(id int(5));show create table tt1;
Database changed
Query OK, 0 rows affected (0.03 sec)

+——-+————————————————————————————–+
| Table | Create Table                                                                         |
+——-+————————————————————————————–+
| tt1   | CREATE TABLE `tt1` (
`id` int(5) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |                                                         为什么是utf8 ,我的character_set_database设置可是latin1
+——-+————————————————————————————–+

惊奇的发现character_set_database自动设置为utf8了
mysql> show variables like ‘char%’;
+————————–+—————————-+
| 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/share/mysql/charsets/ |
+————————–+—————————-+

来创建一个字符集为latin1的数据库
mysql> create database mymy character set latin1;
Query OK, 1 row affected (0.00 sec)

mysql> show create database mymy;
+———-+—————————————————————–+
| Database | Create Database                                                 |
+———-+—————————————————————–+
| mymy     | CREATE DATABASE `mymy` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+———-+—————————————————————–+
1 row in set (0.00 sec)

mysql> use mymy;show variables like ‘char%’;
Database changed
+————————–+—————————-+
| Variable_name            | Value                      |
+————————–+—————————-+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+————————–+—————————-+
8 rows in set (0.00 sec)
瞧自动设置为latin1了

mysql> create table tt1(id int(5));show create table tt1;
Query OK, 0 rows affected (0.02 sec)

+——-+—————————————————————————————-+
| Table | Create Table                                                                           |
+——-+—————————————————————————————-+
| tt1   | CREATE TABLE `tt1` (
`id` int(5) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+——-+—————————————————————————————-+
1 row in set (0.00 sec)
当然是latin1啦

在创建一个不是默认数据库的表

mysql> create table test.tt1(id int(5));show create table test.tt1;
Query OK, 0 rows affected (0.04 sec)

+——-+————————————————————————————–+
| Table | Create Table                                                                         |
+——-+————————————————————————————–+
| tt1   | CREATE TABLE `tt1` (
`id` int(5) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+——-+————————————————————————————–+

测试结果说明character_set_database这个值不是一个定死的值,而是根据use DB,这个DB规定的字符集来切换的,也就是一个动态改变的值,use到的这个数据库的字符集是latin1,它就是latin1,DB的字符集是utf8它就是utf8。



字符集和乱码问题

上周碰到一个奇怪的问题,就是从业务数据库中查询一个字段varchar(100)查到100个汉字,但是我自己建一个测试表却只能对varchar(10)字段插入3个汉字,从数据库的字符集,到表字符集,再到字段的字符集,都检查了一遍,都是utf8格式,后来才查出来是客户端字符集设置问题,character_set_client设置为latin1了,设置为utf8就正常了,

下面整理一下若干字符集参数

character_set_client   客户端的字符集

character_set_connection 连接字符集

character_set_database   默认数据库的字符集 (use database切换默认数据库)

character_set_server  服务器默认的字符集  (当你创建数据库的时候如果没有指定字符集,那么就使用这个值)

character_set_filesystem  在使用LOAD DATA INFILE, SELECT ... INTO OUTFILE , LOAD_FILE()函数的时候会有从character_set_client到character_set_filesystem的切换(默认值为binary,表示不进行任何转换)

如果表和列的字符集合为UTF8,当character_set_client和character_set_connection设置为UTF8时,OK插入中文没问题,查询出现乱码?那么检查

character_set_results是否设置为UFT8,什么还有问题,那么要注意下客户端软件(比如putty)显示字符集的设置.

SET CHARACTER (临时改变character_set_client,character_set_connection值)

set names utf8(临时改变character_set_client,character_set_connection, character_set_results值为utf8)

charset utf8 相当于set names utf8

创建数据库语句
CREATE DATABASE IF NOT EXISTS my_db default charset utf8 COLLATE utf8_general_ci;
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics