字符集相关变量理解

建表

创建一个新表,想让他的字符集是 gbk,怎么弄?

尝试1:

image.png
失败!原因:

set names gbk; 等价于:

set character_set_client = gbk;
set character_set_connection = gbk;
set character_set_results = gbk;

尝试2:

image.png
失败!原因:

charactor_set_server 控制的是创建的 database 字符集。
建表字符集受控于 character_set_database。

改用下面的方式就可以:控制 db 的字符集,间接实现控制表的字符集。
image.png

尝试3

成功!
image.png
原因:character_set_database 能改变当前数据库的字符集,影响建表字符集。

数据收发

下面三个变量控制连接字符集

set character_set_client = gbk;
set character_set_connection = gbk;
set character_set_results = gbk;

表示:客户端使用的字符集、server 使用的字符集、结果集使用的字符集。

如果三者都是一样,可以用 set names gbk 来简写。

疑问:character_set_client 和 character_set_results 可以不一样?

client 是utf8(表示它发来的query字符串的字符集是utf8)
result 是 gbk (表示query执行结果的字符集会转成 gbk)
client 发 utf8,收 gbk,实际有这种场景?

**回答:**有!比如你要写一个 transfer data as it is 的程序,你就不会去转换字符集。PHP 程序里,character_set_client 设置成 UTF8,去查数据库里不同表,不同表的字符集不同,character_set_results 可以设置为 NULL,这样可以把不同表的数据“原汁原味”地返回给客户端。至于外面的客户端如何用,他们自有办法(比如,原样存入文件给客户下载)。 参考这篇文章(要梯子)

操作接口

允许直接设置数字!(是 collation 的值,不是 charset!)

mysql> SET @@character_set_client = 48;
Query OK, 0 rows affected (0.01 sec)

mysql> SET @@character_set_client = 2;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'character_set_client';
+----------------------+--------+
| Variable_name        | Value  |
+----------------------+--------+
| character_set_client | latin2 |
+----------------------+--------+
1 row in set (0.03 sec)

mysql> SET @@character_set_client = 48;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'character_set_client';
+----------------------+--------+
| Variable_name        | Value  |
+----------------------+--------+
| character_set_client | latin1 |
+----------------------+--------+
1 row in set (0.00 sec)

mysql> SET @@character_set_client = 45;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'character_set_client';
+----------------------+---------+
| Variable_name        | Value   |
+----------------------+---------+
| character_set_client | utf8mb4 |
+----------------------+---------+
1 row in set (0.00 sec)

mysql> SET @@character_set_client = 90;
ERROR 1231 (42000): Variable 'character_set_client' can't be set to the value of '90'
mysql> SET @@character_set_client = 0;
ERROR 1115 (42000): Unknown character set: '0'
mysql> SHOW COLLATION;
+--------------------------+----------+-----+---------+----------+---------+
| Collation                | Charset  | Id  | Default | Compiled | Sortlen |
+--------------------------+----------+-----+---------+----------+---------+
| big5_chinese_ci          | big5     |   1 | Yes     | Yes      |       1 |
| big5_bin                 | big5     |  84 |         | Yes      |       1 |
| dec8_swedish_ci          | dec8     |   3 | Yes     | Yes      |       1 |
| dec8_bin                 | dec8     |  69 |         | Yes      |       1 |
| cp850_general_ci         | cp850    |   4 | Yes     | Yes      |       1 |
| cp850_bin                | cp850    |  80 |         | Yes      |       1 |
| hp8_english_ci           | hp8      |   6 | Yes     | Yes      |       1 |
| hp8_bin                  | hp8      |  72 |         | Yes      |       1 |
| koi8r_general_ci         | koi8r    |   7 | Yes     | Yes      |       1 |
| koi8r_bin                | koi8r    |  74 |         | Yes      |       1 |
| latin1_german1_ci        | latin1   |   5 |         | Yes      |       1 |
| latin1_swedish_ci        | latin1   |   8 | Yes     | Yes      |       1 |
| latin1_danish_ci         | latin1   |  15 |         | Yes      |       1 |
| latin1_german2_ci        | latin1   |  31 |         | Yes      |       2 |
| latin1_bin               | latin1   |  47 |         | Yes      |       1 |
| latin1_general_ci        | latin1   |  48 |         | Yes      |       1 |
| latin1_general_cs        | latin1   |  49 |         | Yes      |       1 |
| latin1_spanish_ci        | latin1   |  94 |         | Yes      |       1 |
| latin2_czech_cs          | latin2   |   2 |         | Yes      |       4 |
| latin2_general_ci        | latin2   |   9 | Yes     | Yes      |       1 |
| latin2_hungarian_ci      | latin2   |  21 |         | Yes      |       1 |
| latin2_croatian_ci       | latin2   |  27 |         | Yes      |       1 |
| latin2_bin               | latin2   |  77 |         | Yes      |       1 |
| swe7_swedish_ci          | swe7     |  10 | Yes     | Yes      |       1 |
| swe7_bin                 | swe7     |  82
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值