`
myharmony
  • 浏览: 108135 次
  • 性别: Icon_minigender_1
  • 来自: 中山市
社区版块
存档分类
最新评论

oracle的字符储存(按字节或按字符),substr和substrb

阅读更多
以前知道有substrb,lengthb等函数,也知道它们是以byte来计算长度,可没用过,也不太明白什么地方需要用到它们。一直就是用substr,length,以字符来计算长度,在我看来varchar2和char里面存的都是字符,那么自然也就不可能以byte为单位来计算长度,也就用不到这些函数了,但事实证明我错了。最近有个procedure出错,往表里insert时总是报1401错误,看了一下程序,觉得问题很奇怪,目标表出错字段的长度是50,insert的对应这个字段的取法也是substr(**,1,50),怎么会出错呢?有些怀疑是汉字字符为双字节的原因,于是试着将substr(**,1,50)改为了substr(**,1,25),果然ok。上网找原因,在asktom上找到了解答。
原来,数据库里的varchar2和char字段长度定义是有两种方式,按字节或按字符,按字节定义长度的方式是varchar2(n byte)或者char(n byte),这也是缺省的长度定义方式,也就是说,平时我们用到的varchar2(n)或者char(n)都是按字节定义长度的,按字符定义长度的方式是varchar2(n char)或者char(n char),这样的定义方式可以确保字段有足够的空间储存需要的字符,无论这些字符的长度是多少字节。我们遇到的这个错误的原因在于,数据库的字符集是多字节字符集,也就是说中文字符占多个字节,而源字段的内容都是中文,这样substr(**,1,50)的字节长度可能达到100,自然超过了目标表字段中的50了。
总结一些经验和教训,觉得在建表之前,如果某个字段需要储存中文的话,最好明确一下字段需要的长度是否是按字符来决定的。如果是按字符并且数据库字符集为多字节,那建表时就应该采取按字符定义长度的方式来定义该字段的长度。
分享到:
评论
1 楼 mxl86 2010-01-28  
不错不错,刚知道还有这么一个类型的字段,呵呵~~~~

相关推荐

    常用oracle字符串操作函数

    这两个函数与SUBSTR()和LENGTH()类似,但在处理包含多字节字符(如Unicode字符)的字符串时更精确。 12. **CHR()** 函数: CHR() 可以将ASCII码转换为对应的字符。例如,`CHR(65)` 返回 'A'。 13. **REVERSE()**...

    Oracle 基础语句 函数大全(字符串函数

    14. **SUBSTRB** 函数:与SUBSTR类似,但考虑字符编码,如UTF-8中的多字节字符。 15. **SOUNDEX** 函数:计算字符串的Soundex码,用于识别发音相似的单词。 16. **TRANSLATE** 函数:将字符串中的某些字符替换为...

    Oracle字符函数

    Oracle字符函数是数据库管理中非常重要的组成部分,它们用于处理和操作字符串数据,使得在SQL查询和PL/SQL程序中对文本进行处理变得更为便捷。在Oracle数据库系统中,有一系列丰富的字符函数,可以帮助我们实现诸如...

    oracle中length、lengthb、substr、substrb函数用法介绍

    在Oracle数据库中,处理字符串时经常会用到几个关键的函数,包括`length`、`lengthb`、`substr`和`substrb`。这些函数在处理不同编码的字符串时尤其重要,因为不同的字符集(如UTF-8)可能会影响字符串的实际存储...

    Oracle常用的函数大全详细介绍

    在非Unicode环境下,SUBSTRB和SUBSTR行为相同,但在处理多字节字符集(如UTF-8)时,两者的区别就显现出来了。 除了这些基础函数,Oracle还提供了许多其他有用的函数,如: - **TO_CHAR和TO_DATE**:用于将数值或...

    Oracle常用函数

    在处理包含多字节字符(如Unicode字符)的字符串时,应优先使用SUBSTRB,因为它考虑了字符编码。 4. **SUBSTR函数**: SUBSTR函数与SUBSTRB类似,但默认以字符为单位而非字节。对于单字节字符集,两者行为相同,但...

    oracle常用函数

    例如,`SUBSTR('Oracle Database', 1, 5)`返回"Oracle",`SUBSTRB('Oracle Database', 1, 5)`也返回"Oracle",但如果是多字节字符,可能会有所不同。 8. REPLACE: 该函数用于在字符串中查找并替换指定的子串。例如...

    Oracle常用函数.docx

    Oracle数据库系统中包含众多函数,这些函数用于处理和操作数据,提高数据查询和处理的效率。以下是基于给定文件中的部分Oracle常用函数的详细说明: 1. ASCII() 和 CHR() - ASCII() 函数接收一个字符串,返回其第...

    常用ORACLE知识浅析1

    SUBSTR和SUBSTRB分别用于按字符和字节截取字符串。TO_CHAR函数用于日期和数字的格式化转换。例如,`to_char(sysdate,'yyyy-MM-dd HH24:mi:ss')`将当前日期时间转换为指定格式的字符串。CAST函数则可以进行数据类型的...

    oracle系统内置函数大全

    16. SUBSTRB函数:与SUBSTR类似,但它返回的是字节值。 17. TRANSLATE函数:替换字符串中的指定字符集为另一个指定字符集。 18. TRIM函数:删除字符串的前后指定字符集。 19. UPPER函数:将字符串中的所有字符转换为...

    oracle函数的用法[定义].pdf

    6. **INSTRB函数**:与INSTR类似,但返回的是字节位置,适用于包含多字节字符的字符串。 7. **LENGTH函数**:LENGTH函数返回字符串的字符长度。例如,LENGTH('Oracle')将返回7。 8. **LENGTHB函数**:返回字符串的...

    oracle基础

    SUBSTR()和SUBSTRB()提取子字符串,SOUNDEX()生成发音相似的代码,TRANSLATE()替换字符,TRIM()删除指定字符,BOTH、LEADING和TRAILING指定删除的方向。 数值函数方面,ABS()返回绝对值,CEIL()和FLOOR()分别向上和...

    Oracle函数大全.pdf

    - **substr/substrb**: 提取字符串的一部分。 - **translate**: 替换字符串中的字符。 - **upper**: 将字符串转换为大写。 - **ASCII**: 返回字符的ASCII值。 - **instr/instrb**: 查找子字符串在字符串中的位置。 -...

    Oracle常用函数.pdf

    6. **INSTRB()**:与INSTR()类似,但返回的是字节数,尤其在处理多字节字符时非常有用。 7. **LENGTH()**:返回字符串`c1`的长度,如果字符串为NULL,返回NULL值。 8. **LENGTHB()**:与LENGTH()相同,但返回的是...

    Oracle SQL培训笔记

    - **说明**: `Substr` 和 `Substrb` 分别用于基于字符集和字节截取字符串。从字符串中提取子串时,可以使用正数或负数表示起始位置,负数表示从字符串末尾开始计数。 - **示例**: 对于字符串 "我是中国人",`...

    oracle常见1000问

    15. `SUBSTRB(CHAR, M, N)`:与`SUBSTR`类似,但适用于双字节字符,如汉字。 以上是Oracle中一些常用的SQL优化技巧和内部函数的介绍,了解并熟练运用这些知识点可以显著提升数据库操作的效率和质量。在实际工作中,...

    oracle数据库常用的函数

    16. **SUBSTRB**: 同SUBSTR,但是按照字节而非字符来计算长度。 - 示例: `SELECT SUBSTRB('thatisabook', -4, 4) FROM DUAL;` 返回结果为 `book`。 17. **TRANSLATE**: 将字符串中的指定字符替换成其他字符。 - ...

    oracle函数介绍(8) 综述.doc

     substrb:以字节为单位  substrc:以unicode完全字符为单位  substr2:以UCS2代码点为单位  substr4:以UCS4代码点为单位  它们对于字符的处理方式都是一致的,只不过在我们看来相同的字符在它们看来可能就...

    oracle系统内置函数

    - **功能**: 类似于`SUBSTR`, 但计算字节而非字符位置。 - **使用示例**: - `SELECT SUBSTRB('Hello World', 3, 3) FROM DUAL;` // 返回 'llo' **17. TRANSLATE** - **语法**: `TRANSLATE(source, search, ...

    Oracle函数大全

    14. **SUBSTR(s, i[, j])** 和 **SUBSTRB(s, i[, j])**:前者按字符计算,后者按字节计算,用于获取字符串`s`从位置`i`开始长度为`j`的子串。 - 示例:`SUBSTR('Hello World', 7, 5)` 返回 `'World'` 15. **...

Global site tag (gtag.js) - Google Analytics