utf8_general_ci utf8 microsoft for convert collations sql-server pdo character-encoding freetds multibyte

sql server - utf8 - PDO DBLIB codificación de caracteres multibyte(chino)-servidor SQL



sqlsrv (5)

¿Hay alguna forma de insertar datos multibyte en la base de datos SQL [en particular]? ¿Hay alguna otra solución?

  1. Si puede cambiar a PDO_ODBC, Microsoft proporciona controladores ODBC de SQL Server gratuitos para Linux (solo para Red Hat Enterprise Linux de 64 bits y SUSE Linux Enterprise de 64 bits) que admiten Unicode.

  2. Si puede cambiar a PDO_ODBC, entonces el prefijo N para insertar Unicode funcionará.

  3. Si puede cambiar la tabla afectada de SQL_Latin1_General_CP1_CI_AS a UTF-8 (que es el valor predeterminado para MSSQL), entonces eso sería lo ideal.

Su caso es más restringido. Esta solución es adecuada para el caso cuando ha mezclado caracteres multibyte y no multibyte en su cadena de entrada, y necesita guardarlos en una tabla latina, y el prefijo de tipo de datos N no funciona, y no desea para cambiar de PDO DBLIB (debido a que el Unicode PDO_ODBC de Microsoft apenas es compatible con Linux). Aquí hay una solución.

Codifique condicionalmente la cadena de entrada como base64 . Después de todo, es así como podemos transportar imágenes de forma segura en línea con los correos electrónicos.

Ejemplo de trabajo:

$DBH = new PDO("dblib:host=$myServer;dbname=$myDB;", $myUser, $myPass); $query = " INSERT INTO [StackOverflow].[dbo].[UserSignUpInfo] ([FirstName]) VALUES (:firstname)"; $STH = $DBH->prepare($query); $firstname = "输入中国文字!Okay!"; /* First, check if this string has any Unicode at all */ if (strlen($firstname) != strlen(utf8_decode($firstname))) { /* If so, change the string to base64. */ $firstname = base64_encode($firstname); } $STH->bindParam('':firstname'', $firstname); $STH->execute();

Luego, para ir hacia atrás, puedes probar las cadenas base64 y decodificarlas solo sin dañar tus entradas existentes, de esta manera:

while ($row = $STH->fetch()) { $entry = $row[0]; if (base64_encode(base64_decode($entry , true)) === $entry) { /* Decoding and re-encoding a true base64 string results in the original entry */ print_r(base64_decode($entry) . PHP_EOL); } else { /* Previous entries not encoded will fall through gracefully */ print_r($entry . PHP_EOL); } }

Las entradas se guardarán así:

Guan Tianlang 5pys6Kqe44KS5a2maGVsbG8=

Pero puedes volver a convertirlos fácilmente a:

Guan Tianlang 输入中国文字!Okay!

En una máquina Linux, estoy usando PDO DBLIB para conectarme a una base de datos MSSQL e insertar datos en una tabla SQL_Latin1_General_CP1_CI_AS . El problema es que cuando intento insertar caracteres chinos (multibyte) se insertan como 哈市香åŠåŒºç æ±Ÿè·¯å· .

Mi código (parte de) es el siguiente:

$DBH = new PDO("dblib:host=$myServer;dbname=$myDB;", $myUser, $myPass); $query = " INSERT INTO UserSignUpInfo (FirstName) VALUES (:firstname)"; $STH = $DBH->prepare($query); $STH->bindParam('':firstname'', $firstname);

Lo que he probado hasta ahora:

  1. Haciendo mb_convert_encoding a UTF-16LE en $firstname y CAST como VARBINARY en la consulta como:

    $firstname = mb_convert_encoding($firstname, ''UTF-16LE'', ''UTF-8'');

    VALUES (CAST(:firstname AS VARBINARY));

    Lo que resulta en la inserción de los caracteres correctamente, hasta que hay algunos caracteres no multibyte, que interrumpen la ejecución del PDO.

  2. Configurando mi conexión como utf8:

    $DBH = new PDO("dblib:host=$myServer;dbname=$myDB;charset=UTF-8;", $myUser, $myPass); $DBH->exec(''SET CHARACTER SET utf8''); $DBH->query("SET NAMES utf8");

  3. Estableciendo client charset de client charset a UTF-8 en mi freetds.conf

    Lo que no tuvo impacto.

¿Hay alguna forma de insertar datos multibyte en esa base de datos SQL? ¿Hay alguna otra solución? Pensé en probar DOP ODBC o incluso mssql, pero pensé que es mejor preguntar aquí antes de perder más tiempo.

Gracias por adelantado.

EDITAR:

Terminé usando MSSQL y el prefijo de tipo de datos N Cambiaré y probaré PDO_ODBC cuando tenga más tiempo. ¡Gracias a todos por las respuestas!


Este enlace Explica el carácter chino en MYSQL. No puedo insertar caracteres chinos en MySQL . Tienes que crear table table_name () CHARACTER SET = utf8; Use UTF-8 cuando inserte en la tabla

set username utf8; INSERT INTO table_name (ABC,VAL);

abd create Database en CHARACTER SET utf8 COLLATE utf8_general_ci;

A continuación, puede insertar en caracteres chinos en la tabla


La colación no debería importar aquí.

Los caracteres de doble byte deben almacenarse en los campos nvarchar , nchar o ntext . No necesitas realizar ningún casting.

El prefijo de tipo de datos n significa nacional y hace que SQL Server almacene texto como Unicode (UTF-16).

Editar:

PDO_DBLIB no admite Unicode y ahora está en desuso.

Si puede cambiar a PDO_ODBC, Microsoft proporciona controladores ODBC de SQL Server gratuitos para Linux que admiten Unicode.

Microsoft - Documentación del controlador ODBC de SQL Server

Blog: Instalación y uso del controlador ODBC de Microsoft SQL Server para Linux


Puede usar el tipo de datos compatible con Unicode para la columna de la tabla para admitir idiomas extranjeros (las excepciones se muestran en EDIT 2).

(char, varchar, text) Versus (nchar, nvarchar, ntext)

No Unicode:

El más adecuado para el inglés estadounidense: "Un problema con los tipos de datos que usan 1 byte para codificar cada carácter es que el tipo de datos solo puede representar 256 caracteres diferentes. Esto obliga a múltiples especificaciones de codificación (o páginas de códigos) para diferentes alfabetos, como los alfabetos europeos. que son relativamente pequeños. También es imposible manejar sistemas como el kanji japonés o los alfabetos de Hangul coreano que tienen miles de caracteres

Unicode

Se adapta mejor a los sistemas que necesitan admitir al menos un idioma extranjero: "La especificación de Unicode define un esquema de codificación único para la mayoría de los caracteres que se usan ampliamente en las empresas de todo el mundo. Todas las computadoras traducen de manera consistente los patrones de bits de los datos de Unicode en caracteres utilizando Unicode único. especificación. Esto garantiza que el mismo patrón de bits se convierta siempre al mismo carácter en todas las computadoras. Los datos se pueden transferir libremente de una base de datos o de una computadora a otra sin preocuparse de que el sistema receptor traduzca los patrones de bits en caracteres de manera incorrecta.

Ejemplo:

También he probado un ejemplo en el que puede ver sus pantallas a continuación, sería útil para los problemas relacionados con las inserciones en idiomas extranjeros, ya que la pregunta es ahora. La columna que se ve a continuación en nvarchar y es compatible con el idioma chino

EDITAR 1:

Otro tema relacionado se discute here

EDIT 2:

Los scripts Unicode no compatibles se muestran here