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

时间:2012-02-07 15:19:44

标签: php sql-server-2008 unicode codeigniter-2

我正在使用带有Active Record的MS SQL Server和CodeIgniter 2来处理我正在进行的项目,我只是偶然发现了这个问题:

当我提交包含中文或印地文字符的表单时,我将其存储在一个表中,当我查看它时,我得到的是问号。如果我尝试英文或希腊字符,一切似乎都能正常工作。

我认为这与我正在编写的PHP有关的原因是因为如果我直接在SQL Server Management Studio中复制粘贴中文文本,所有值都会在SQL Studio上完美地存储和显示和网络应用程序。

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

$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中的charset编码

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

当我尝试存储中文字符时,不会出现这种情况 提前谢谢你:)

6 个答案:

答案 0 :(得分:9)

尝试在插入db:

之前使用iconv()转换输入
$input = iconv('','UTF-8',$str);

答案 1 :(得分:3)

从PHP处理Microsoft SQL Server中的编码可能非常痛苦。 CharacterSet选项包含在用于PHP的Microsoft SQL Server驱动程序1.1版(SQLSRV)中,所以有一个机会,你使用的是不支持设置ChracterSet的过时版本,尽管这不太可能。将char_set更改为UTF-16不是一种选择,因为SQLSRV仅支持UTF-8。

更有可能出现以下情况之一:

    在你的php.ini中,
  • 选项default_charset未设置为UTF-8
  • 由于您可能正在使用Windows计算机,因此.php文件未使用UTF-8进行编码。

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

编辑:关于@Markus评论:CodeIgniter的system/database/drivers/sqlsrv/sqlsrv_driver.php看起来像一个围绕sqlsrv-commands的简单包装,似乎不太可能,这个问题 是由CodeIgniter-code引起的。

答案 2 :(得分:0)

看起来这个答案得到了很多关注,我觉得不能将实际解决方案发布到我的问题上......我猜错了礼仪的不良礼节我多年前选择的答案,所以我现在不知道。这里......

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

因此,当您想在表格中插入多字节字符时,必须在字符串前添加字符var selectedItem = this.props.renderProps.data.find(function (item) { return item.value === event.target.value; }); selectedItem.label;

因此,在上面的示例中,查询应该看起来像这样才能工作

N

不,CI目前还没有为您提供内置的方法。计划在CI4中添加,但在此之前here is a hack for you

答案 3 :(得分:0)

我有错误:

  

错误号码:IMSSP

将查询字符串翻译为UTF-16时发生错误:没有干扰ningunaasignaciónenlapáginadecódigosdemúltiplesdodesde destino paraelcarácterUnicode。

对我来说,工作人员:

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

在对DB进行查询之前。

答案 4 :(得分:0)

我有同样的问题,但只有htmlspecialchars()为我工作。

$value = htmlspecialchars($input)

答案 5 :(得分:-2)

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

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

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

并且db编码必须正确设置为utf-16。