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.