MariaDB如何在CAST特性上设置自定义/别名数据类型

dgsult0t  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(140)

我正在使用NodeJS /mysql 2/ MariaDB Ver 15.1 Distrib 10.6.7-MariaDB,如果我理解正确的话,JSON并不真正被支持。JSON是一个longBlob的别名,每次插入或更新都有一个JSON_VALID测试。
我不喜欢手动解析所有查询结果中的所有JSON对象。
我发现可以在mysql连接中注入一个typeCast函数。

typeCast: function (field, next) {
    if ( field.length === "LONG_BLOB" ) {
      try {
         return JSON.parse( field.string() )
      } catch (err){
         return field.string();
      }
    } else {
      return next();
    }
  }

这种方法在某些情况下可以很好地工作,但不是每次都可以

SELECT JSON_OBJECT('a', 1) ... will give a short blob
  {
     type: 'BLOB',
     length: 12582912,
     db: '',
     table: '',
     name: 'sctCap',
     string: [Function: string],
     buffer: [Function: buffer],
     geometry: [Function: geometry]
   }

是否有办法强制数据类型为LONG_BLOB或将字段强制转换为自定义数据类型?
提前感谢你的帮助

wr98u20j

wr98u20j1#

最后找到了一个解决办法,可能是笨......我也不知道.由于LONGBLOB的强制转换是不可能的,创建一个函数来得到它:

CREATE DEFINER=`user`@`localhost` FUNCTION `_ToLongBlob`(
    `a` LONGBLOB
)
RETURNS longtext CHARSET utf8

转换回JSON:

JSON_EXTRACT(_ToLongBlob( JSON_OBJECT("id" , B.id, "nom", B.nom) ), "$") AS

向mysql连接添加一个typeCast函数:

typeCast: function (field, next) {
    if (field.type === "LONG_BLOB") {
      try {
        return JSON.parse( field.string())
      } catch (err) {
        return field.string();
      }
    } else {
      return next();
    }
  }

如果有一个简单的方法,请发表评论。提前感谢。

相关问题