mariadb utf8mb4带动态列&程序

时间:2016-08-31 10:50:21

标签: mariadb emoji utf8mb4

对于带有动态列的mariadb utf8mb4,我有两个问题。

最重要的是,我使用mariadb 10.0版并通过jdbc连接。 为了保存表情符号字符,我修改了mariadb,如下所示,

  1. 在/etc/my.cnf中编辑

    的[mysqld]
    character-set-server = utf8mb4
    collat​​ion-server = utf8mb4_unicode_ci

  2. 已编辑的DB Table Charset。

  3.     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;
    
    1. 从JDBC String中删除characterEncoding参数

      已删除的粒子:characterEncoding = utf-8

    2. 所以,它是完美的,表情符号字符被保存在一个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'));
      

      结果: 测试|| {\ “名称\”:\ “测试\”}

      我不知道为什么。请帮帮我。

1 个答案:

答案 0 :(得分:1)

sso_json blob acquires the table's DEFAULT CHARACTER SET utf8; you need utf8mb4 for Emoji, as you did with name.