【问题标题】:mariadb utf8mb4 with dynamic column & procedure带有动态列和过程的 mariadb utf8mb4
【发布时间】:2017-01-07 22:12:27
【问题描述】:

我有两个关于动态列的 mariadb utf8mb4 问题。

首先,我使用 mariadb 10.0 版并通过 jdbc 连接。 为了保存 emoji 字符,我将 mariadb 修改如下,

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

    [mysqld]
    字符集服务器 = utf8mb4
    排序服务器 = utf8mb4_unicode_ci

  2. 已编辑 DB 表字符集。

创建表“成员”( `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `regdate` 日期时间默认为 NULL, `sso_json` blob, ..(跳过).. ) 引擎=InnoDB 默认字符集=utf8 排序=utf8_unicode_ci;
  1. 从 JDBC 字符串中移除 characterEncoding 参数

    删除的粒子:characterEncoding=utf-8

所以,很完美,表情符号字符被准确地保存在 varchar 列中ㅁ。但不在动态列中。在 Ad-Hoc Query 和过程中,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????????????????'));

结果: 测试???????????????? || {\"名称\":\"测试????????????????\"}

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

【问题讨论】:

    标签: mariadb emoji utf8mb4


    【解决方案1】:

    sso_json blob获取表的DEFAULT CHARACTER SET utf8;表情符号需要 utf8mb4,就像使用 name 一样。

    【讨论】:

      猜你喜欢
      • 2020-11-23
      • 1970-01-01
      • 2018-06-01
      • 2020-06-10
      • 2013-04-26
      • 2017-09-07
      • 2018-05-13
      • 2018-06-07
      • 2011-12-14
      相关资源
      最近更新 更多