zoukankan      html  css  js  c++  java
  • Oracle数据库的varchar2(2)存储一个汉字时提示插入汉字过长问题

    昨天在oracle实验课上出现了如题所示的问题:varchar2(2)在存储一个汉字时,提示插入汉字过长,要把它改成3才能存储1个汉字。于是百度google之。

    先做以下实验:

    建一个简单的表var,只有一列name,数据类型为varchar2(6),并向表中插入一条数据。

    1. create table var (name varchar2(6));
    2. insert into var values('测试');


    查询插入的数据,并且同时查看name列的字符长度和字节长度。结果如下图:

    1. select u.name, length(u.name), lengthb(u.name)
    2. from var u;
     

    从结果中可以看出,一个汉字占了三个字节,而不是两个,这跟字符集有关。

    查看字符集的代码和结果如下:

    1. select userenv('language') from dual;
     
    结果显示,本机Oracle的字符集是UTF-8,32位,而不是GBK的16位。UTF-8的每个字符占3个字节(bytes),可以通过修改默认字符集来实现varchar2(2)存储一个汉字。方法如下:

     

    1. SHUTDOWN IMMEDIATE;
    2. STARTUP MOUNT;
    3. ALTER SYSTEM ENABLE RESTRICTED SESSION;
    4. ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
    5. ALTER DATABASE OPEN;
    6. ALTER DATABASE CHARACTER SET AL32UTF8/ZHS16GBK;
    7. SHUTDOWN IMMEDIATE;
    8. STARTUP;
     
    附:

    ORACLE nvarchar2和varchar2的区别

    1、NVARCHAR2中存储中文字时,一个中文字当一个字符来处理
    NVARCHAR2(10)是可以存进去10个汉字的,如果用来存英文也只能存10个字符。
    2、而VARCHAR2中一个中文字当两个字符来处理
    VARCHAR2(10)的话,则只能存进5个汉字,英文则可以存10个

    Oracle中nvarchar2和varchar2的共同点:
    不定长存储,当存储信息长度小于指定的长度,那么就已实际存入的长度为准这一点不像varchar这种定长存储那样浪费空间,比如varchar 指定是10个字符,那么存入5个字符的时候,他会自动填充空格来补齐以达到指定的长度
     
  • 相关阅读:
    浅析CString内部实现机制
    ...sourceannotations.h(142) : error C3094: “repeatable”: 不允许匿名使用
    非MFC项目使用CString及如何打印
    GetTextExtentPoint32--获取字符串在屏幕上长度
    窄字符与宽字符相关的操作
    如何给图片添加黑色边框
    react native
    礼仪 习俗 文化
    职业 行业 2 博客
    读书 文摘 笔记 2 人生的支柱
  • 原文地址:https://www.cnblogs.com/liuzhuqing/p/7480386.html
Copyright © 2011-2022 走看看