2012-02-07 48 views
4

我使用MS SQL Server和笨2的一个项目我工作的活动记录存储在SQL Server数据库的多字节字符,我只是偶然发现了这个问题:如何使用笨

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

我相信这是与我写的PHP有关的原因是因为如果我直接在SQL Server Management Studio中复制粘贴中文文本,所有值都存储并完美显示,都在SQL Studio和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

笨回答与此错误:

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

不出现,当我尝试存储中国文字 预先感谢您:)

+0

也许在您的PHP INI文件中设置它可以帮助您排除故障? ini_set('default_charset','UTF-8'); – Markus 2012-02-07 15:28:15

+1

也在您的网页上确认您使用的是正确的编码。 Markus 2012-02-07 15:29:31

+0

我不知道这个设置在PHP中!我会检查它tommorow并通知:) – Loupax 2012-02-07 16:28:16

回答

0

貌似这个答案得到了很多的关注,我心疼不公布实际解决我的问题......我猜想这是一种糟糕的礼节,取消了我多年前选择的答案,所以现在我不会这样做。 Here goes ...

不需要对设置进行任何更改。问题与查询有关,不幸的是,CodeIgniter不支持正确的查询格式。

所以当你想插入多字节字符到你的表中时,你必须在字符串之前加上字符N

所以在我的例子中,上面的查询应该是这样为了工作

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

不,CI目前不会给你一个内置的方式做到这一点。它可刨,可添加在CI4,但在那之前here is a hack for you

-1

尝试用UTF-16编码,无论是在:

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

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

而且还分贝编码必须正确设置为UTF-16。

+0

这些设置使我无法连接到我的数据库。问题是,没有办法手动设置MSSQL的默认排序规则...不是像我可以在MySQL中至少一样... – Loupax 2012-02-14 09:34:53

3

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

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

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

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

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

+0

这确实听起来像痛苦...换句话说,我将不得不检查我的所有输入是否包含UTF-16字符,并且在提交到数据库之前是否将它们转换为UTF-8? Ouch ...我会尝试更新我的sqlsrv驱动程序,并在确认后接受此答案! – Loupax 2012-02-14 14:11:38

+0

只能使用iconv按照@Amin_Adha建议的方式进行转换。设置default_charset没有区别(我没有使用代码点火器btw) – 2014-06-01 21:19:17

7

尝试插入之前的iconv()的输入转换为DB:

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

这是不好的做法。如果你已经正确设置了所有东西(数据库接口,文件编码),那么你永远不需要'iconv()'或PHP中的任何其他编码转换功能。 – 2015-10-02 11:19:34

0

我有这个错误:

Error Number: IMSSP

发生错误翻译的查询字符串为UTF-16:无干草NINGUNAasignaciónEN LA páginadecódigosdemúltiplesbytes de destino para elcarácterUnicode。 。

对我来说有workrs:

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

做对DB查询之前。

0

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

$value = htmlspecialchars($input) 
+0

将数据存储到数据库中时,确实不应更改用户输入。 – Loupax 2017-06-06 11:55:15