当创建存储过程或视图时,其内出现的文本字符默认使用系统变量character_set_connection和collation_connection指定的字符集和排序规则。可以使用SHOW CREATE语句获取所使用的值。要改变已存在存储过程、视图中的文本字符的字符集,需要删除存储程序然后重建。
对于存储过程的参数和返回值,可以通过CHARACTER SET和COLLATE子句来指定其使用的字符集和排序规则。在MariaDB 5.5之前不支持指定排序规则。
下面的示例中展示了创建存储程序时所使用的字符集和排序规则。
SET @@local.character_set_connection='latin1'; DELIMITER || CREATE PROCEDURE `test`.`x`() BEGIN SELECT CHARSET('x'); END; || Query OK, 0 rows affected (0.00 sec) DELIMITER ; SET @@local.character_set_connection='utf8'; CALL `test`.`x`(); +--------------+ | CHARSET('x') | +--------------+ | latin1 | +--------------+下面的示例中展示了如何指定函数的参数和返回值的字符集和排序规则:
CREATE FUNCTION `test`.`y`(`str` TEXT CHARACTER SET utf8 COLLATE utf8_bin) RETURNS TEXT CHARACTER SET latin1 COLLATE latin1_bin BEGIN SET @param_coll = COLLATION(`str`); RETURN `str`; END; -- 返回值的排序规则: SELECT COLLATION(`test`.`y`('Hello, planet!')); +-----------------------------------------+ | COLLATION(`test`.`y`('Hello, planet!')) | +-----------------------------------------+ | latin1_bin | +-----------------------------------------+ -- 参数的排序规则: SELECT @param_coll; +-------------+ | @param_coll | +-------------+ | utf8_bin | +-------------+示例:更改默认的字符集为UTF-8
要改变默认的字符集latin1为UTF-8,需要在配置文件my.cnf中进行如下设置:
[client] ... default-character-set=utf8 ... [mysql] ... default-character-set=utf8 ... [mysqld] ... collation-server = utf8_unicode_ci init-connect='SET NAMES utf8' character-set-server = utf8 ...注意,选项default-character-set是一个客户端选项,而非服务端选项。
本文为mariadb官方手册:SETTING CHARACTER SETS AND COLLATIONS的译文。
原文:https://mariadb.com/kb/en/setting-character-sets-and-collations/
我提交到MariaDB官方手册的译文:https://mariadb.com/kb/zh-cn/setting-character-sets-and-collations/