You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MyBatis中使用n前缀插入NVARCHAR2数据(无需修改Tomcat配置)

在MyBatis中为NVARCHAR2列添加n前缀插入字符串的解决方案

针对你的需求,这里提供两种可靠的实现方式,解决旧字符集下存储€符号的问题:

方式1:使用字符串拼接绑定参数(安全无注入)

通过n'' || #{value}的方式拼接,Oracle会自动将绑定的参数识别为国家字符集类型,效果等效于目标SQL的n'value'格式:

<insert id="createOne" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
    INSERT INTO table
        (
            id,
            column
        )
    VALUES
        (
            FBK_SQ_PAGOPA_CREDITOR_INFO_ID.nextval,
            n'' || #{value}
        )
</insert>

方式2:指定MyBatis类型处理器

直接为参数指定NStringTypeHandler,MyBatis会自动为字符串参数添加n前缀,适配NVARCHAR2列的字符集要求:

<insert id="createOne" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
    INSERT INTO table
        (
            id,
            column
        )
    VALUES
        (
            FBK_SQ_PAGOPA_CREDITOR_INFO_ID.nextval,
            #{value, typeHandler=org.apache.ibatis.type.NStringTypeHandler}
        )
</insert>

为什么之前的写法无效?

  • n#{value}:生成的SQL为n ?,不符合Oraclen'xxx'的语法格式,无法被识别为国家字符集常量
  • n'#{value}':MyBatis不会解析单引号内的#{value},会直接将#{value}作为字符串内容插入,导致SQL语法错误
  • n${value}:若参数无单引号,生成nvalue格式错误;若参数包含单引号,存在严重SQL注入风险
  • n #{value}:空格会导致Oracle无法识别n为国家字符集前缀,语法不生效

内容的提问来源于stack exchange,提问作者LiefLayer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:42:57