如何使用CodeIgniter在SQL Server数据库中存储多字节字符


How to store multi byte characters in SQL Server database using CodeIgniter

我正在为一个项目使用带有活动记录的MS SQL Server和CodeIgniter 2,我刚刚偶然发现了这个问题:

当我提交一个包含中文或印地语字符的表格时,我会将其存储在一个表中,当我查看它时,我得到的只是问号。如果我试着用英文或希腊文字,一切似乎都很好。

我之所以相信这与我正在编写的PHP有关,是因为如果我直接在SQLServerManagementStudio中复制粘贴中文文本,那么所有值都会完美地存储和显示在SQLServerStudio和web应用程序上。

这些是我正在使用的数据库设置:

$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;

这是我现在正在测试的表的结构:

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

这是我在config.php 中的字符集编码

$config['charset'] = 'utf-8';

新的故障排除数据

我试图通过表单保存以下字符串:Iñtërnâtiônàlizætiøn

CodeIgniter回复此错误:

An error occurred translating the query string to UTF-16: No mapping for the Unicode character exists in the target multi-byte code page. .

当我尝试存储汉字时,不会出现这种情况提前感谢:)

在插入到db:之前,尝试用iconv()转换您的输入

$input = iconv('','UTF-8',$str);

从PHP处理Microsoft SQL Server中的编码可能非常痛苦。CharacterSet选项包含在Microsoft SQL Server Driver for PHP(SQLSRV)的1.1版本中,因此,您使用的是不支持设置ChracterSet的过时版本,尽管这不太可能。将char_set更改为UTF-16不是一个选项,因为SQLSRV只支持UTF-8。

更可能的情况是以下其中之一适用:

  • 在php.ini中,选项default_charset未设置为UTF-8
  • 因为您可能在Windows机器上工作,所以您的.php文件不是用UTF-8编码的

如果这不能解决问题,那么您的输入可能包含一个或多个无效的UTF-8字符。在这种情况下,请尝试使用iconv()转换您的(用户)输入。

edit:关于@Markus评论:CodeIgniter的system/database/drivers/sqlsrv/sqlsrv_driver.php看起来像是sqlsrv命令的简单包装,因此似乎不太可能是由CodeIgniter代码引起的。

看起来这个答案受到了很多关注,我为没有发布问题的实际解决方案而感到难过。。。我想取消选择我多年前选择的答案是不礼貌的,所以我现在不会。给

无需对设置进行任何更改。这个问题与查询有关,不幸的是CodeIgniter不支持开箱即用的正确查询格式。

因此,当您想在表中插入多字节字符时,必须在字符串之前加上字符N

因此,在我上面的例子中,为了运行,查询应该是这样的

INSERT INTO test_table (title) VALUES (N'Iñtërnâtiônàlizætiøn')

不,CI目前没有为您提供内置的方法。它计划在CI4上添加,但在此之前,这里有一个适合您的破解

我有这个错误:

错误编号:IMSSP

将查询字符串转换为UTF-16时出错:没有目标字符Unicode的多个字节。

对我来说,工作人员有:

iconv('','utf-8',$pass);

在对DB进行查询之前。

我遇到了同样的问题,但只有htmlspecialchar()对我有效。

$value = htmlspecialchars($input)

尝试使用utf-16编码,两者都在:中

$config['charset'] = 'utf-16';

$db['local']['char_set'] = 'utf16';

此外,db编码必须正确设置为utf-16。