Shanghai Tengke Education Dameng Base de datos Capacitación Compartir productos secos Base de datos Dameng Almacenamiento de caracteres chinos Saber cuánto

1. Introducción

 

Cuando tratamos con caracteres chinos en DM7, a menudo usamos el tipo de datos varchar. Sin embargo, la cantidad de caracteres chinos que se pueden almacenar en varchar varía según los parámetros de inicialización de la base de datos. Entonces, en cada caso, ¿cuál es la diferencia en el almacenamiento de caracteres? Este artículo lo llevará a descubrirlo.

 

2. Introducción a los parámetros

 

Cuando usamos DMINIT para inicializar la base de datos, tenemos los siguientes dos parámetros relacionados con el juego de caracteres, UNICODE_FLAG y LENGTH_IN_CHAR.

 

UNICODE_FALG : este parámetro representa el juego de caracteres de todos los datos de la base de datos, incluido el juego de caracteres del diccionario de datos. Cabe señalar que una vez que se inicializa la base de datos, el juego de caracteres no se puede modificar. Podemos usar select Unicode para consultar el tipo de juego de caracteres de la base de datos actual, 0 representa gb18030 y 1 representa UTF-8.

 

LENGTH_IN_CHAR : este parámetro determina si la longitud del objeto de tipo VARCHAR en la base de datos está en caracteres. Se establece un valor de 1 para utilizar caracteres como unidad, y el valor de la longitud de almacenamiento se aumenta de acuerdo con la longitud teórica de los caracteres. Si el valor es 0, la longitud de todos los objetos de tipo VARCHAR está en bytes.

 

Del mismo modo, si usamos el asistente DBCA para crear la base de datos, también podemos modificar los valores de estos dos parámetros en el paso del parámetro de inicialización.

 

 

3. Prueba

 

De acuerdo con los diferentes valores de Unicode y length_in_char (0 o 1), inicializamos un total de cuatro bases de datos diferentes para probar diferentes situaciones.

 

Este artículo muestra el entorno: DM Database Server x64V7.1.6.48-Build (2018.03.01-89507) ENT

 

3.1 、 UNICODE_FLAG = 0 , LENGTH_IN_CHAR = 0

 

Esta situación es la configuración predeterminada cuando se inicializa la base de datos, es decir, el juego de caracteres es gb18030 y la longitud varchar está en bytes. Las pruebas relacionadas son las siguientes

 

Sabemos que el siguiente carácter chino o carácter de ancho completo en gb18030 generalmente ocupa dos bytes. Por lo tanto, el tipo varchar (3) puede insertar un carácter chino más un carácter de ancho medio, pero no puede insertar dos caracteres chinos.

 

3.2 、 UNICODE_FLAG = 1 , LENGTH_IN_CHAR = 0

 

El juego de caracteres es utf-8 y la longitud varchar está en bytes. Las pruebas relevantes son las siguientes:

 

 

En el caso de Utf-8, un carácter chino generalmente necesita ocupar tres bytes, por lo que varchar (3) solo puede insertar un carácter chino.

 

3.3 、 UNICODE_FLAG = 0 , LENGTH_IN_CHAR = 1

 

El juego de caracteres es utf-8 y la longitud de varchar está en caracteres. La prueba es la siguiente

 

 

Sabemos que en el caso de length_in_char = 1, el número real de bytes almacenables de varchar se ampliará en una cierta proporción. Entonces, cuando se usa gb18030, varchar (3) puede almacenar 3 caracteres chinos, es decir, 3 * 2 = 6 bytes de datos.

 

3.4 、 UNICODE_FLAG = 1 , LENGTH_IN_CHAR = 1

 

El juego de caracteres es utf-8 y la longitud de varchar está en caracteres

 

 

Aquí nos encontraremos con una situación extraña, obviamente la configuración es varchar (3), por eso podemos insertar 4 caracteres chinos. Esto se debe a que los datos reales almacenados en la base de datos en DM7 están en bytes. Cuando lengtg_in_char = 1 y el juego de caracteres es utf-8, la longitud máxima del objeto de tipo VARCHAR realmente almacenado es la longitud definida por el tipo VARCHAR * 4 bytes.

 

En otras palabras, los datos que se pueden almacenar en una estructura varchar (3) son 3 * 4 = 12 bytes. Sin embargo, de hecho, un carácter chino en UTF-8 generalmente solo ocupa 3 bytes, por lo que aquí podemos insertar 12/3 = 4 caracteres chinos.

 

4. Resumen

 

Cuando LENGTH_IN_CHAR = 0, la longitud de varchar () está en bytes. En este momento, solo necesitamos considerar el número de bytes que ocupan los caracteres chinos y los caracteres de ancho completo. Un carácter chino en gb18030 tiene dos bytes, y un carácter chino en utf-8 generalmente es de tres bytes. Si el número total de bytes de datos insertados es mayor que la longitud definida por varchar, la inserción fallará.

 

Cuando LENGTH_IN_CHAR = 1, el número de bytes que puede almacenar varchar () se expandirá de acuerdo con una cierta proporción. Cuando el juego de caracteres es gb18030, el número de bytes de varchar es igual a la longitud definida * 2, y cuando el juego de caracteres es utf-8, el número de bytes de varchar es la longitud definida * 4.

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_42726883/article/details/108399168
Recomendado
Clasificación