我的小程序整个架构是 app+ asp.net + mysql
因为在“短信定时提醒”中的“随手记”里想存储表情符,所以还是经过了一番折腾的。
首先上网查遍了emoji表情符的设置方法,参见以下链接文章
http://blog.csdn.net/u012329294/article/details/78961682
网上介绍的所有方法都是告诉你字符要从utf8变更为utf8mb4,才能存储4个字节。
但我将mysql数据库中的字符集更改为utf8mb4,仍然无法保存成功。
mysql>
SHOW VARIABLES WHERE Variable_name LIKE
'character%'
OR
Variable_name LIKE
'collation%'
;
+--------------------------+--------------------+
|
Variable_name | Value |
+--------------------------+--------------------+
|
character_set_client | utf8 |
|
character_set_connection | utf8 |
|
character_set_database | utf8mb4 |
|
character_set_filesystem | binary |
|
character_set_results | utf8 |
|
character_set_server | utf8mb4 |
|
character_set_system | utf8 |
|
collation_connection | utf8_unicode_ci |
|
collation_database | utf8mb4_unicode_ci |
|
collation_server | utf8mb4_unicode_ci |
character_set_client、character_set_connection
、character_set_results、collation_connection
怎么弄才能解决这个问题啊? 这个困扰了我很久!尝试了各种办法都不行。
最后坐下来慢慢思考这4个变量的含义。
从第一个变量中间有一个client,我猜想到是不是这个需要客户端进行配置啊。
所以大胆的将web.config中数据库连接character="utf8"变为character="utf8mb4",
哈哈哈,这个竟然出现了神奇的效果,突然成功了一次,欣喜万分。
不过接下来又出现了新的问题,保存到“随手记”中的字符,保存时是乱码,修改时才能变成表情符。
到底这两个有什么区别呢?
原来我的开发中在修改的时候用的原始的SQL语句,但在保存的时候使用的是存储过程。
是不是存储过程有问题?
嗯,顺着这个思路往下找,发现存储过程中有事务,那么会不会是事务造成字符集失效呢?
尝试在开始事务后,重新设置一下set names utf8mb4,如下:
DECLARE result_code INTEGER DEFAULT 0; -- 定义返回结果并赋初值0
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET result_code=1; --
START TRANSACTION; -- 开始事务
set names utf8mb4;
...
IF result_code = 1 THEN -- 可以根据不同的业务逻辑错误返回不同的result_code,这里只定义了1和0
ROLLBACK;
ELSE
COMMIT;
END IF;
竟然成功了,呵呵,太厉害了,竟然让我猜出来了!
最后,还是看看我开发的“短信定时提醒”小程序,你也可以做的更好,扫码试一下,
你也可以做的更好!