第08期:有关 MySQL 字符集的注意事项( 三 )


mysql> show create database ytt_new3G*************************** 1. row ***************************       Database: ytt_new3Create Database: CREATE DATABASE `ytt_new3` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */1 row in set (0.00 sec)查询出来最麻烦 , 因为每次查询出来的结果只能有一个字符集 , 字符集兼容的列可以一起检索;不兼容的列得分开检索 。举个例子 , 我想简单的 SELECT * 拿出所有记录 , 结果发现有一个字段据显示不正常 。
mysql> select * from t1;+-----------+------------------+--------------+| a1| a2| a3|+-----------+------------------+--------------+| character | 瀛楃?闆嗗悎| 字符集合|+-----------+------------------+--------------+1 row in set (0.00 sec)所以针对这种情形 , 该怎么检索数据呢?必须得对单个字段检索或者是对兼容的列一起检索 。
-- 以字符集 GBK 输出列 a1 a2 , 由于 a1 是保存的是字母 , 所以兼容输出 。mysql> set names gbk;Query OK, 0 rows affected (0.00 sec)mysql> select a1,a2 from t1;+-----------+--------------+| a1| a2|+-----------+--------------+| character | 字符集合|+-----------+--------------+1 row in set (0.00 sec)-- 以字符集utf8mb4和gbk不兼容 , 得单独输出列a3 。或者单独输出a2.mysql> set names utf8mb4;Query OK, 0 rows affected (0.00 sec)mysql> select a3 from t1;+--------------+| a3|+--------------+| 字符集合|+--------------+1 row in set (0.00 sec)2. 隐式转换
这种方式 , 是最推荐的 , 也是最长的方式 , 所有列继承表的字符集 , 不单独指定 。
-- 建表 t2 , 指定字符集为 gbk.mysql> create table t2(a1 varchar(10),a2 varchar(10)) charset gbk;Query OK, 0 rows affected (0.05 sec)mysql> show create table t2G*************************** 1. row ***************************Table: t2Create Table: CREATE TABLE `t2` (`a1` varchar(10) DEFAULT NULL,`a2` varchar(10) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=gbk1 row in set (0.01 sec)但是这里有一个需要注意的点 , 如果此时对表进行字符集变更 , 那表的列依然保留原来的字符集 。
例如:
mysql> alter table t2 charset utf8;Query OK, 0 rows affected, 1 warning (0.01 sec)Records: 0Duplicates: 0Warnings: 1mysql> show create table t2G*************************** 1. row ***************************Table: t2Create Table: CREATE TABLE `t2` (`a1` varchar(10) CHARACTER SET gbk DEFAULT NULL,`a2` varchar(10) CHARACTER SET gbk DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.00 sec)如果想把表里字段的字符集也改了 , 应该用以下语句更改表字符集 。
mysql> alter table t2 convert to character set utf8;Query OK, 0 rows affected, 1 warning (0.09 sec)Records: 0Duplicates: 0Warnings: 1mysql> show create table t2G*************************** 1. row ***************************Table: t2Create Table: CREATE TABLE `t2` (`a1` varchar(10) DEFAULT NULL,`a2` varchar(10) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.00 sec)那到这儿 , 我们已经了解了字符集对数据库 , 表以及列的使用以及相关影响 。
【第08期:有关 MySQL 字符集的注意事项】大致总结下 , 这篇我详细介绍了字符集在 MySQL 数据库 , 表以及列相关对象处理时的注意事项 , 并且举例说明 。希望对大家有帮助 。


推荐阅读