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

2. 继承设置(隐式转换)
默认继承所属数据库级别的字符集和排序规则 。这里需要注意的是所属数据库 , 不是当前数据库 。
mysql> create database ytt_new2 default character set latin1 collate latin1_bin;Query OK, 1 row affected (0.03 sec)mysql> use ytt_new2Database changedmysql> select @@character_set_database,  @@collation_database;+--------------------------+----------------------+| @@character_set_database | @@collation_database |+--------------------------+----------------------+| latin1                   | latin1_bin           |+--------------------------+----------------------+1 row in set (0.00 sec)3. 视图
视图其实就是虚拟的表 , 所以视图的字符集也划在表这块简单介绍下 。视图的字符集完全依赖客户端的字符集设置 。
比如:
-- 简单写个存储过程DELIMITER $$USE `ytt_new2`$$DROP PROCEDURE IF EXISTS `sp_demo`$$CREATE DEFINER=`root`@`%` PROCEDURE `sp_demo`(    IN f1 VARCHAR(10),    IN f2 VARCHAR(10)    )BEGIN    DECLARE v1 VARCHAR(20);    SET v1 = CONCAT(f1,f2);    SELECT v1 AS result;END$$DELIMITER ;4. 触发器
触发器基于表 , 所以触发器也归类到表这块 。其实触发器的编码规则和视图一样 。也是依赖客户端的设定 。
比如一个简单的触发器:
mysql> show create procedure sp_demoG*************************** 1. row ***************************           Procedure: sp_demo...  Database Collation: latin1_bin1 row in set (0.00 sec)-- 那接下来改掉数据库的字符集为 UTF8mysql> alter database ytt_new2 character set utf8 collate utf8_general_ci;Query OK, 1 row affected, 2 warning (0.02 sec)mysql> select @@character_set_database,  @@collation_database;+--------------------------+----------------------+| @@character_set_database | @@collation_database |+--------------------------+----------------------+| utf8                     | utf8_general_ci      |+--------------------------+----------------------+1 row in set (0.00 sec)-- 再查看存储过程 sp_demo 的字符集 , 还是之前的 。mysql> show create procedure sp_demoG*************************** 1. row ***************************           Procedure: sp_demo...  Database Collation: latin1_bin1 row in set (0.00 sec)-- 此时 , 调用存储过程 , 字符集不对 , 报编码错误 。mysql> call sp_demo('我','你');ERROR 1366 (HY000): Incorrect string value: '\xE6\x88\x91' for column 'f1' at row 1-- 改变存储过程字符集只能删除重建 , 重新执行下之前的存储过程代码 , 再次调用 , 结果就正常了 。mysql> call sp_demo('我','你');+--------+| result |+--------+| 我你   |+--------+1 row in set (0.00 sec)Query OK, 0 rows affected, 2 warnings (0.01 sec)三、列和字符集1. 显式指定
同数据库和表一样 , 列也可以显式指定特定的字符集和排序规则 。虽说是可以这样做 , 但是非常不推荐 , 最主要原因是每个列字符集不一样 , 导致写入和检索都得额外的编写 SQL 。
mysql> select @@character_set_server charset,  @@collation_server collation    -> union all    -> select @@character_set_database,  @@collation_database;+---------+--------------------+| charset | collation          |+---------+--------------------+| utf8mb4 | utf8mb4_0900_ai_ci || utf8mb4 | utf8mb4_0900_ai_ci |+---------+--------------------+2 rows in set (0.00 sec)那接下来简单插入一条记录 , 需要为每列添加 introduer , 否则报错 。


推荐阅读