Comment conserver le multi-octets dans la base de données SQL Server à l'aide de CodeIgniter
Je suis à l'aide de MS SQL Server et CodeIgniter 2 avec Active Record pour un projet sur lequel je travaille, et je viens de tombé sur ce problème:
Quand je soumettre un formulaire qui contient les Chinois ou en Hindi des personnages, je les stocker dans une table, et quand j'ai vue de tout cela, je reçois sont des points d'interrogation. Si j'essaie anglais ou en caractères grecs, tout semble bien fonctionner.
La raison pour laquelle je crois que c'est quelque chose à voir avec le PHP je suis en train d'écrire, c'est parce que si je l'ai copier-coller le texte chinois directement dans SQL Server Management Studio, toutes les valeurs sont stockées et affichées parfaitement, tant sur le SQL Studio, et l'application web.
Ce sont les db réglages que j'utilise:
$db['local']['dbdriver'] = 'sqlsrv';
$db['local']['dbprefix'] = '';
$db['local']['pconnect'] = FALSE;
$db['local']['db_debug'] = TRUE;
$db['local']['cache_on'] = FALSE;
$db['local']['cachedir'] = '';
$db['local']['char_set'] = 'utf8';
$db['local']['dbcollat'] = 'utf8_general_ci';
$db['local']['swap_pre'] = '';
$db['local']['autoinit'] = TRUE;
$db['local']['stricton'] = FALSE;
C'est la structure de la table, je suis en essais sur le droit maintenant:
CREATE TABLE [dbo].[languages](
[id] [int] IDENTITY(1,1) NOT NULL,
[language] [nvarchar](1024) NULL,
[language_local] [nvarchar](1024) NULL,
[lang_code] [nvarchar](100) NULL,
[core] [bit] NULL,
CONSTRAINT [PK_languages] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Et c'est mon encodage de caractères dans config.php
$config['charset'] = 'utf-8';
De nouvelles données de dépannage
J'ai essayé de sauver la chaîne suivante par le biais de mon formulaire: Iñtërnâtiônàlizætiøn
CodeIgniter a répondu avec cette erreur:
An error occurred translating the query string to UTF-16: No mapping for the Unicode character exists in the target multi-byte code page. .
Cela n'apparaît pas lorsque j'essaie de stocker des caractères Chinois
Merci d'avance 🙂
Également sur vos pages web, vérifiez que vous utilisez le bon encodage. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
Je n'étais pas au courant de cette mise en php! Je vais vérifier tommorow et informer 🙂
Ce n'était pas la... et Aussi toutes mes pages ont le <meta> charset UTF-8 :/
Vous utilisez une classe de CodeIgniter ou d'une autre API pour l'interface avec votre base de données? Écrire un moyen rapide et mysqli connecteur et passer une instruction SQL insert avec les caractères UTF-8 dans le corps de la forme, pour voir si vous pouvez repérer un problème avec l'API que vous utilisez.
OriginalL'auteur Loupax | 2012-02-07
Vous devez vous connecter pour publier un commentaire.
Essayer de convertir votre entrée avec iconv() avant de les insérer dans la base de données :
iconv()
ou de tout autre encodage de la fonction de conversion en PHP.OriginalL'auteur Amin Adha
De la manipulation de l'encodage dans Microsoft SQL Server à partir de PHP peut être très douloureuse. Le CharacterSet-option a été inclus avec la version 1.1 du Pilote Microsoft SQL Server pour PHP (SQLSRV), donc il y a une chance, vous utilisez une version obsolète qui ne prend pas en charge la définition de la ChracterSet, même si c'est peu probable. Changer
char_set
de l'UTF-16 n'est pas une option, comme SQLSRV prend uniquement en charge UTF-8.Plus probablement l'une des situations suivantes s'applique:
default_charset
n'est pas défini à l'UTF-8Si cela ne résout pas le problème, alors votre entrée contient probablement un ou plusieurs personnages, qui ne sont pas en UTF-8 valide. Dans ce cas, essayez de convertir votre (utilisateur) d'entrée avec
iconv()
.edit: Concernant @Markus commentaire: CodeIgniter est system/database/drivers/sqlsrv/sqlsrv_driver.php ressemble à un simple wrapper autour de la sqlsrv-commandes, il semble donc peu probable que le problème n'
est causée par CodeIgniter-code.
seulement la conversion à l'aide de iconv proposé par @Amin_Adha travaillé. Réglage de la default_charset ne fait aucune différence (je ne suis pas en utilisant le code de l'allumeur btw)
OriginalL'auteur dbrumann
J'ai eu ce erreur:
Une erreur s'est produite la traduction de la chaîne de requête de l'UTF-16: No hay ninguna asignación en la página de códigos de múltiples octets de destino para el carácter Unicode. .
Et pour moi workrs avec:
avant de faire la requête sur la DB.
OriginalL'auteur diegolaprida
J'ai eu le même problème mais seulement htmlspecialchars() a fonctionné pour moi.
OriginalL'auteur Ali
on dirait que cette réponse est l'objet de beaucoup d'attention, et je me sens mal de ne pas poster la réelle solution à mon problème... je suppose que c'est mauvais étiquette de sélectionner une réponse que j'ai choisi il y a plusieurs années donc je ne vais pas pour l'instant. Voilà...Pas de changement nécessaire à faire pour les paramètres. Le problème est de requêtes liées, et, malheureusement, CodeIgniter ne supporte pas le bon format de la requête de la boîte.
Ainsi, lorsque vous voulez insérer des caractères multioctets dans votre tableau, vous devez faire précéder le caractère
N
avant votre chaîne.Donc, dans mon exemple ci-dessus, la requête devrait ressembler à ceci dans le but de travailler
Pas de, CI ne dispose pas actuellement de vous donner un construit dans la façon de le faire. Il est prévu pour être ajouté sur CI4, mais jusqu'alors, voici un hack pour vous
OriginalL'auteur Loupax
Essayer avec le codage utf-16, à la fois dans :
et
Et aussi la db encodage doit être mis correctement en tant que utf-16.
OriginalL'auteur mlinuxgada