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了。
总结一些经验和教训,觉得在建表之前,如果某个字段需要储存中文的话,最好明确一下字段需要的长度是否是按字符来决定的。如果是按字符并且数据库字符集为多字节,那建表时就应该采取按字符定义长度的方式来定义该字段的长度。
一个汉字有几个字节?
依据编码形式:
GB-231280 编码为 2个字节(Byte) 包含了 20902 个汉字,其编码范围是 0x8140-0xfefe。
GB18030-2000(GBK2K) 在 GBK 的基础上进一步扩展了汉字,增加了藏、蒙等少数民族的字形。编码是变长的,其二字节部分与 GBK 兼容;四字节部分是扩充的字形、字位,其编码范围是首字节 0x81-0xfe、二字节0x30-0x39、三字节 0x81-0xfe、四字节0x30-0x39
Unicode 范围一般所用为\U0000-\UFFFF,对于CJK EXT B区汉字,范围大于\U20000
UTF, 按其基本长度所用位数分为UTF-8/16/32。其中:
UTF-8是变长编码,每个Unicode代码点按照不同范围,可以有1-3字节的不同长度。
UTF-16长度相对固定,只要不处理大于\U200000范围的字符,每个Unicode代码点使用16位即2字节表示,超出部分使用两个UTF-16即4字节表示。按照高低位字节顺序,又分为UTF-16BE/UTF-16LE。
UTF-32长度始终固定,每个Unicode代码点使用32位即4字节表示。按照高低位字节顺序,又分为UTF-32BE/UTF-32LE。
一般用GB-231280 ,所以大多数情况下是占2个字节。
分享到:
相关推荐
7. SUBSTR和SUBSTRB: 这两个函数用于提取字符串的子串。SUBSTR从指定位置开始提取指定数量的字符,而SUBSTRB则按字节提取。例如,`SUBSTR('Oracle Database', 1, 5)`返回"Oracle",`SUBSTRB('Oracle Database', 1, 5...
在Oracle数据库中,处理字符串时经常会用到几个关键的函数,包括`length`、`lengthb`、`substr`和`substrb`。这些函数在处理不同编码的字符串时尤其重要,因为不同的字符集(如UTF-8)可能会影响字符串的实际存储...
- 子字符串提取:TSQL有SUBSTRING,PL/SQL有SUBSTR和SUBSTRB(用于处理Unicode字符)。 - 日期处理:TSQL的系统日期是GETDATE(),PL/SQL是SYSDATE。 - 空值判断与处理:TSQL使用`IS NULL`,空值替换用`ISNULL()`...
SUBSTR和SUBSTRB分别用于按字符和字节截取字符串。TO_CHAR函数用于日期和数字的格式化转换。例如,`to_char(sysdate,'yyyy-MM-dd HH24:mi:ss')`将当前日期时间转换为指定格式的字符串。CAST函数则可以进行数据类型的...
SUBSTR函数与SUBSTRB类似,但默认以字符为单位而非字节。对于单字节字符集,两者行为相同,但在处理多字节字符集时,可能需要额外的注意。`SUBSTR(string, start_position, length)`会返回`string`中从`start_...
在非Unicode环境下,SUBSTRB和SUBSTR行为相同,但在处理多字节字符集(如UTF-8)时,两者的区别就显现出来了。 除了这些基础函数,Oracle还提供了许多其他有用的函数,如: - **TO_CHAR和TO_DATE**:用于将数值或...
- **字符串操作**:Oracle支持substr、substrb等函数截取字符串,MySQL使用substring、mid等函数实现类似功能。 ### 总结 Oracle与MySQL在数据库领域各有所长,Oracle以其卓越的性能和功能在企业级应用中占据主导...
Clob数据则用`GET_LENGTH`和`SUBSTR`操作。 4. **更新数据**: 更新Blob和Clob数据通常涉及先清除现有数据(`DBMS_LOB.CLEAR`),然后重新插入。也可以直接使用`DBMS_LOB.WRITE`或`DBMS_LOB.CHANGE_LENGTH`进行...
10. SUBSTR() 和 SUBSTRB() - SUBSTR() 提取字符串c1从位置i开始的j个字符。如SUBSTR('Message',1,4)返回'Mess'。 - SUBSTRB() 与SUBSTR类似,但根据字节而非字符提取。 11. SOUNDEX() - SOUNDEX() 生成一个代表...
- **说明**: `Substr` 和 `Substrb` 分别用于基于字符集和字节截取字符串。从字符串中提取子串时,可以使用正数或负数表示起始位置,负数表示从字符串末尾开始计数。 - **示例**: 对于字符串 "我是中国人",`...
substrb:以字节为单位 substrc:以unicode完全字符为单位 substr2:以UCS2代码点为单位 substr4:以UCS4代码点为单位 它们对于字符的处理方式都是一致的,只不过在我们看来相同的字符在它们看来可能就...
- SUBSTR/SUBSTRB: 返回字符串的指定部分。 示例:SUBSTR('Message',1,4)返回'Messa'。 - TRANSLATE: 将字符串中的字符替换为其他字符。 示例:TRANSLATE('fumble','uf','ar')将'fumble'中的'f'和'u'分别替换为'...
--li_bytes:=substr(lv_bytes,1,li_pos-1)*256+substr(lv_bytes,li_pos+1)-256*256; Select ascii(lv_char)-256*256 Into li_bytes From dual; select max(spell) Into lv_temp from table(f_getSpellcode) where...
11. **SUBSTRB()** 和 **LENGTHB()** 函数: 这两个函数与SUBSTR()和LENGTH()类似,但在处理包含多字节字符(如Unicode字符)的字符串时更精确。 12. **CHR()** 函数: CHR() 可以将ASCII码转换为对应的字符。...
14. **SUBSTRB** 函数:与SUBSTR类似,但考虑字符编码,如UTF-8中的多字节字符。 15. **SOUNDEX** 函数:计算字符串的Soundex码,用于识别发音相似的单词。 16. **TRANSLATE** 函数:将字符串中的某些字符替换为...
SUBSTR()和SUBSTRB()提取子字符串,SOUNDEX()生成发音相似的代码,TRANSLATE()替换字符,TRIM()删除指定字符,BOTH、LEADING和TRAILING指定删除的方向。 数值函数方面,ABS()返回绝对值,CEIL()和FLOOR()分别向上和...
12. **SUBSTRB()** 和 **UTL_RAW.CAST_TO_VARCHAR2()**:在处理包含Unicode字符的字符串时,这两个函数特别有用。SUBSTRB按字节截取,UTL_RAW.CAST_TO_VARCHAR2则用于将RAW类型数据转换为VARCHAR2。 了解并熟练运用...
- **substr/substrb**: 提取字符串的一部分。 - **translate**: 替换字符串中的字符。 - **upper**: 将字符串转换为大写。 - **ASCII**: 返回字符的ASCII值。 - **instr/instrb**: 查找子字符串在字符串中的位置。 -...
15. `SUBSTRB(CHAR, M, N)`:与`SUBSTR`类似,但适用于双字节字符,如汉字。 以上是Oracle中一些常用的SQL优化技巧和内部函数的介绍,了解并熟练运用这些知识点可以显著提升数据库操作的效率和质量。在实际工作中,...