parámetro de longitud charla cadena de datos y NLS_LENGTH_SEMANTICS

Hemos diseñado un tipo de cadena de base de datos se utiliza con frecuencia, desde el formato ASCII convencional para el formato UTF-8, que corresponden a los diferentes requerimientos de la aplicación de diferentes tipos de caracteres y la configuración de longitud. Para Oracle, el más común tipo de carbón y varchar2 nada menos que los dos tipos básicos.

Para algunas aplicaciones chinos, los diseñadores deben centrarse en la cuestión ficha de datos de longitud de la cadena. Desde un código de secuencia de diferentes maneras, un carácter chino que corresponde a un personaje de bytes diferentes longitudes. Por ejemplo, una longitud de campo se establece en 10, si el personaje puede acomodar Inglés longitud de 10 bits, si los caracteres chinos sólo pueden acomodar hasta longitud de 5 bits. Si la amplia clase como tipo de conjunto de caracteres UTF-8, también 3-4 caracteres chinos.

Longitud de los tipos de cadena definida, lo que significa esto? En Oracle, definimos varchar2 (10) es en realidad dos apreciado, es una longitud de bytes de 10 bits, y la otra entrada es de 10 caracteres de longitud. Dos entendimientos antigua escuela técnica, que se entiende desde una perspectiva de aplicación empresarial. De hecho, en el nivel de implementación de Oracle, dos estrategias son compatibles.

 

En primer lugar, los  ajustes de los parámetros por defecto

He elegido para probar versiones experimentales de Oracle 11gR2, específicamente el número de versión es 11.2.0.4. El conjunto de caracteres actual es AL32UTF8.

En primer lugar experimentar un poco de forma predeterminada, el comportamiento cadena de Oracle.

SQL> create table t (v_char varchar2(10));
Table created
                    
SQL> insert into t values ('ttt');
1 row inserted

SQL> insert into t values ('tttttttttt');
1 row inserted

SQL> commit;
Commit complete

De manera predeterminada, por (10) de tipo VARCHAR2, caracteres ingleses pueden contener 10 caracteres. El siguiente caso de prueba de los caracteres chinos.

SQL> insert into t values ('保护');
1 row inserted

SQL> commit;
Commit complete

SQL> insert into t values ('保护模式');
insert into t values ('保护模式')
ORA-12899: 列 "TEST"."T"."V_CHAR" 的值太大 (实际值: 12, 最大值: 10)

SQL> insert into t values ('保护模');
1 row inserted

SQL> commit;
Commit complete

El tipo de campo de longitud VARCHAR2 (10), tres chinos parece haber un límite. De ser dado cuatro de entrada de China, la base de datos actual será reconocido como una medida de la longitud chino tres. Medios que contienen latente en UTF-8 caso de codificación, varchar2 (10) representa la longitud de 10 bytes.

A continuación, la unidad de control de la longitud es qué parámetros es?

 

二, Char y Byte

Desde el punto de vista, VARCHAR2 (10) la sintaxis de Oracle detrás de la realidad incluye 10 unidades. Por defecto, no es necesario para administrar esta configuración. Si no nos muestran especificado, Oracle será tomado de los NLS_LENGTH_SEMANTICS parámetros.

SQL> show parameter nls_length

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_length_semantics                 string      BYTE

Creación de tablas y campos de proceso definido, podemos especificar explícitamente la longitud de la unidad. Oracle ofrece dos opciones, un byte, y el otro es carbón.

SQL> create table t_char (v_char varchar2(10 char), v_byte varchar2(10));
Table created

SQL> desc t_char;

Name   Type              Nullable Default Comments
------ ----------------- -------- ------- --------
V_CHAR VARCHAR2(10 CHAR) Y                         
V_BYTE VARCHAR2(10)      Y      

El byte actual es la unidad de modo predeterminado (tenga en cuenta esta premisa), v_char visualizar claramente campo de 10 caracteres de longitud.

SQL> insert into t_char(v_char) values ('tttttttttt');
1 row inserted

SQL> insert into t_char(v_char) values ('ttttttttttt');
insert into t_char(v_char) values ('ttttttttttt')
ORA-12899: 列 "TEST"."T_CHAR"."V_CHAR" 的值太大 (实际值: 11, 最大值: 10)

SQL> commit;
Commit complete

10 Prueba de carácter Inglés aprobó, el siguiente experimento con caracteres chinos.

SQL> insert into t_char(v_char) values ('实验实验实验实验实验');
1 row inserted

SQL> commit;
Commit complete

SQL> insert into t_char(v_char) values ('实验实验实验实验实验实验');
insert into t_char(v_char) values ('实验实验实验实验实验实验')
ORA-12899: 列 "TEST"."T_CHAR"."V_CHAR" 的值太大 (实际值: 12, 最大值: 10)

SQL> select * from t_char;

V_CHAR                                   V_BYTE
---------------------------------------- ----------
tttttttttt                              
实验实验实验实验实验       

10 caracteres en caracteres chinos se pueden acomodar mediante el volcado para ver la estructura de almacenamiento de codificación.

SQL> select dump(v_char, 1016) as a from t_char;

A
------------------------------------------------------------------------------------------------------------------------------
Typ=1 Len=10 CharacterSet=AL32UTF8: 74,74,74,74,74,74,74,74,74,74
Typ=1 Len=30 CharacterSet=AL32UTF8: e5,ae,9e,e9,aa,8c,e5,ae,9e,e9,aa,8c,e5,ae,9e,e9,aa,8c,e5,ae,9e,e9,aa,8c,e5,ae,9e,e9,aa,8c

Char se describe en unidades de medida, la base de datos no almacena la longitud seleccionada de acuerdo con la estructura técnica, pero la longitud de almacenamiento medido real.

 

En tercer lugar, los cambios en los parámetros experimentales

Tenga en cuenta que este parámetro cambia sin necesidad de reiniciar, pero la necesidad de reiniciar la base de datos para tener efecto.

SQL> show parameter nls_leng

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_length_semantics                 string      BYTE

SQL> alter system set nls_length_semantics=char scope=both;
System altered

SQL> show parameter nls_leng

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_length_semantics                 string      CHAR

En este momento sólo modificar los parámetros, pero no se reinicia la base de datos, lleve a cabo el siguiente experimento.

SQL> create table t_test (v_char varchar2(10));
Table created

SQL> desc t_test;

Name   Type         Nullable Default Comments
------ ------------ -------- ------- --------
V_CHAR VARCHAR2(10) Y                        

SQL> insert into t_test values ('实验实验实验');
insert into t_test values ('实验实验实验')
ORA-12899: 列 "TEST"."T_TEST"."V_CHAR" 的值太大 (实际值: 18, 最大值: 10)

Se puede ver la longitud de las unidades no cambió la configuración por defecto, el efecto es aún un byte. Si necesita parámetros surta efecto, es necesario reiniciar la instancia de base de datos.

SQL> shutdown immediate
SQL> startup

SQL> show parameter nls_leng

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_length_semantics                 string      CHAR

Probar una vez más, podemos encontrar el éxito.

SQL> create table t_test (v_char varchar2(10));
Table created           

SQL> insert into t_test values ('实验实验实验实验实验');
1 row inserted

SQL> commit;
Commit complete

SQL> select * from t_test;

V_CHAR
----------------------------------------
实验实验实验实验实验

Mientras tanto, el último byte se define como un campo de unidad de medición también está claramente mostrado.

SQL> desc t_char

Name   Type              Nullable Default Comments
------ ----------------- -------- ------- --------
V_CHAR VARCHAR2(10)      Y                        
V_BYTE VARCHAR2(10 BYTE) Y                         

SQL> desc t_byte

Name   Type              Nullable Default Comments
------ ----------------- -------- ------- --------
V_CHAR VARCHAR2(10 BYTE) Y    


En cuarto lugar,  la conclusión

Base de datos de longitud de campo en las áreas tradicionales de desarrollo de aplicaciones es una cuestión más importante. La visión tradicional de que esta sección debe reflejar el pensamiento lógica de negocio, es decir, la longitud del campo correspondiente a la lógica de negocio, o incluso una operación de usuario puede ser controlada por la base de datos. Sin embargo, debido a la longitud de la cadena de factores que afectan los cambios en el diseño de software, que es parte de la lógica cada vez empujado a los niveles de interfaz y la lógica de aplicación para completar.

Para Oracle, la forma en carbón para proporcionar campo personalizado es una estrategia alternativa. En el caso de reacción de base de datos real necesidad estricta lógica de negocio, es una opción bastante buena.

Publicados 295 artículos originales · ganado elogios 35 · Vistas a 80000 +

Supongo que te gusta

Origin blog.csdn.net/Hehuyi_In/article/details/105019395
Recomendado
Clasificación