对于带有动态列的mariadb utf8mb4,我有两个问题。
最重要的是,我使用mariadb 10.0版并通过jdbc连接。 为了保存表情符号字符,我修改了mariadb,如下所示,
在/etc/my.cnf中编辑
的[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
已编辑的DB Table Charset。
CREATE TABLE `MEMBER` ( `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `regdate` datetime DEFAULT NULL, `sso_json` blob, ..(skip).. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
从JDBC String中删除characterEncoding参数
已删除的粒子:characterEncoding = utf-8
所以,它是完美的,表情符号字符被保存在一个varchar列中。但不是在动态专栏中。在Ad-Hoc查询和过程中,column_create()保存问号而不是表情符号。
如下,程序样本。
CREATE DEFINER=`sample`@`%` PROCEDURE `SP_INSERT`(
inName varchar(500) CHARACTER SET utf8mb4
)
BEGIN
SET @pSql = CONCAT( ' INSERT INTO SAMPLE_TBL ( '
, ' name, sso_json '
, ' ) VALUES ( '
, ' ?, COLUMN_CREATE(?, ?) '
, ' ) '
);
-- variables bind
SET @pName = inName;
SET @pKey = 'title';
-- prepare stmt
PREPARE pstmt FROM @pSql;
EXECUTE pstmt USING @pName, @pKey, @pName;
END
程序结果:{'title','?????'}。
在Ad-Hoc查询中,
set names utf8mb4 collate 'utf8mb4_unicode_ci';
select 'test', column_json(column_create('name','test'));
结果: 测试'|| {\ “名称\”:\ “测试???? \”}
结果列是准确的但是column_json没有。
set names utf8;
select 'test', column_json(column_create('name','test'));
结果: 测试|| {\ “名称\”:\ “测试\”}
我不知道为什么。请帮帮我。
答案 0 :(得分:1)
sso_json blob
acquires the table's DEFAULT CHARACTER SET utf8
; you need utf8mb4
for Emoji, as you did with name
.