建表
创建一个新表,想让他的字符集是 gbk,怎么弄?
尝试1:
失败!原因:
set names gbk; 等价于:
set character_set_client = gbk;
set character_set_connection = gbk;
set character_set_results = gbk;
尝试2:
失败!原因:
charactor_set_server 控制的是创建的 database 字符集。
建表字符集受控于 character_set_database。
改用下面的方式就可以:控制 db 的字符集,间接实现控制表的字符集。
尝试3
成功!
原因: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