一文讲解达梦数据库的参数LENGTH_IN_CHAR
本文于 4 天前发布,最后更新于 3 天前

一、问题背景

最近经常看到达梦数据库用户苦恼的一个疑问:为什么新版达梦数据库找不到参数 LENGTH_IN_CHAR?

以下本文就来详细介绍一下这个参数的来龙去脉。

二、关于现状

这个参数一直是非推荐参数,并且于 8.1.3.167 版本正式废弃。

三、关于参数停用的原因分析

(1)设计哲学与历史背景

达梦数据库(DM)在架构设计上遵循了与 Oracle 数据库的一致性原则,采用字节作为数据存储的基本计量单位。
在 DM8 的早期阶段,针对从 MySQL 迁移至 DM 的场景,由于当时 DM 尚未原生支持变长字符类型【如 VARCHAR (N CHAR)】的数据存储需求,故引入了 LENGTH_IN_CHAR 参数作为临时解决方案。
旨在兼容并处理数据字符串截断的特定情境,确保迁移过程中的数据完整性。

(2)兼容性挑战与问题概述

随着项目应用的深入及服务团队的持续反馈,LENGTH_IN_CHAR 参数的启用被发现与多种兼容性问题相关联,核心问题总结如下:

  • LIKE 查询异常
    • 当数据库初始化配置为使用 UTF-8 字符集且不区分大小写,并激活 LENGTH_IN_CHAR 参数时,在执行 SELECT 语句采用 LIKE 模式匹配查询字符串时,曾遇到数据检索不准确的问题。
    • 此问题已在 DM8 的 8.1.2.135 版本中得到修复。
  • DBLINK 查询字符集转换错误
    • 在相似的配置环境下(UTF-8 字符集,不区分大小写,启用 LENGTH_IN_CHAR),通过数据库链接(DBLINK)执行 SELECT 查询时,该参数导致内部字符集转换过程发生异常,引发了字符集截断错误。
    • 此技术障碍亦已在 DM8 的 8.1.1.117 版本中获得解决。
  • 存储差异性问题
    • 若数据库实例配置启用了 LENGTH_IN_CHAR 参数,且字段定义采用 VARCHAR (10),不同字符集的采用将直接影响到实际可存储的数据量。
    • 这进一步凸显了该参数对数据存储一致性可能产生的不利影响,具体表现依字符编码而异。

综上所述,鉴于 LENGTH_IN_CHAR 参数引发的多方面兼容性和一致性问题,结合已有的版本更新修复情况,其停用被视为提升系统稳定性和兼容性的必要举措,并且在 8.1.3.167 版本正式废弃。

四、关于参数停用后的疑问

4.1 MySQL 数据库的数据如何迁移

两种方案:

4.2 已有版本升级或数据导入新版本如何处理

如需要版本升级(使用旧版本已经稳定的系统不建议再升级):建议使用 DTS 迁移到新实例中,其中手动设置类型映射:

  • 将 CHAR 映射为 VARCHAR (以字符存储)
  • VARCHAR 映射为 VARCHAR (以字符存储)
  • VARCHAR2 映射为 VARCHAR2 (以字符存储)

逻辑数据导入:

建议先导入数据结构后,使用 DTS 工具,对原有的 CHAR/VARCHAR/VARCHAR2 类型进行数据映射,改为按字符存储(其中 CHAR 改为 VARCHAR 后按字符存储,或直接扩展字段长度)

目前版本新增了逻辑导入参数 IGNORE_INIT_PARA。可选择忽略某些初始化参数。

暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇