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?
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.
Si puede cambiar a PDO_ODBC, entonces el prefijo N para insertar Unicode funcionará.
Si puede cambiar la tabla afectada de
SQL_Latin1_General_CP1_CI_AS
aUTF-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:
Haciendo
mb_convert_encoding
aUTF-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.
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");
Estableciendo
client charset
declient charset
a UTF-8 en mi freetds.confLo 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
solo use nvarchar, ntext, nChar y cuando quiera insertar, use
INSERT INTO UserSignUpInfo
(FirstName)
VALUES
(N''firstname'');
N
se referirá al personaje de Unicode y es estándar en todo el mundo.
Ref:
https://technet.microsoft.com/en-us/library/ms191200(v=sql.105).aspx
https://irfansworld.wordpress.com/2011/01/25/what-is-unicode-and-non-unicode-data-formats/