当我在Laravel框架中连接到MSSQL数据库并从任何表中读取数据时,都会得到以下信息:
“Ü»ñÏ»ñ¨Ý»ñϳÝÛáõûñ”
我将亚美尼亚文字存储在数据库中。我尝试使用许多不同的字符集,但仍然无法解决我的问题。
我应该使用哪种类型的字符集?
数据存储在varchar中。 我正在使用当前配置,用于连接:
'sqlsrv' => [
'driver' => 'sqlsrv',
'host' => env('MS_DB_HOST', 'localhost'),
'port' => env('MS_DB_PORT', '1433'),
'database' => env('MS_DB_DATABASE', 'forge'),
'username' => env('MS_DB_USERNAME', 'forge'),
'password' => env('MS_DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_bin',
'prefix' => ''
],
@@ sql数据库版本: Microsoft SQL Server 2008 R2(SP1)-10.50.2500.0(X64) 2011年6月17日00:54:03 版权所有(c)Microsoft Corporation Windows NT 6.1(内部版本7601:Service Pack 1)上的标准版(64位)
select c.name, t.name, c.collation_name from sys.columns c join sys.types t on c.system_type_id = t.system_type_id where object_id = object_id('VMATERIALS')
和
select c.name, t.name, c.collation_name from test.sys.columns c join sys.types t on c.system_type_id = t.system_type_id where object_id = object_id('VMATERIALS')
在我的MSSQL数据库中,有以下过程:
CREATE FUNCTION asf_ConvertANSIToUnicode (@Source varchar(500)) RETURNS nvarchar(500) AS
BEGIN
DECLARE @Result nvarchar(500)
DECLARE @i bigint
DECLARE @CharCode bigint
DECLARE @Diff bigint
SET @i = 1
SET @Result = ''
While @i <= LEN(@Source)
Begin
SET @CharCode = ASCII(SUBSTRING(@Source,@i,1))
IF @CharCode<128
SET @CharCode = @CharCode
ELSE
IF @CharCode between 178 and 253
begin
SET @Diff = @CharCode - 178
IF @CharCode % 2 = 0
SET @CharCode = 1329 + @Diff / 2
ELSE
SET @CharCode = 1377 + (@Diff-1) / 2
END
ELSE
SET @CharCode = CASE @CharCode
When 162 Then 1415
When 163 Then 1417
When 164 Then 41
When 165 Then 40
When 166 Then 187
When 167 Then 171
When 168 Then 8212
When 169 Then 46
When 170 Then 1373
When 171 Then 44
When 172 Then 45
When 173 Then 1418
When 174 Then 8230
When 175 Then 1372
When 176 Then 1371
When 177 Then 1374
When 254 Then 1370
ELSE @CharCode
END
SET @Result = @Result + nchar(@CharCode)
SET @i = @i + 1
END
RETURN @Result
END
和
CREATE FUNCTION asfe_ConvertANSIToUnicode (@Source varchar(500)) RETURNS nvarchar(500) AS
BEGIN
RETURN dbo.asf_ConvertANSIToUnicode (@Source)
END
如果它可以帮助我,如何在查询中使用它?
任何帮助将不胜感激。
答案 0 :(得分:1)
在我的数据库中,我具有将ANSI转换为Unicode的功能:
CREATE FUNCTION asf_ConvertANSIToUnicode (@Source varchar(500)) RETURNS nvarchar(500) AS
BEGIN
DECLARE @Result nvarchar(500)
DECLARE @i bigint
DECLARE @CharCode bigint
DECLARE @Diff bigint
SET @i = 1
SET @Result = ''
While @i <= LEN(@Source)
Begin
SET @CharCode = ASCII(SUBSTRING(@Source,@i,1))
IF @CharCode<128
SET @CharCode = @CharCode
ELSE
IF @CharCode between 178 and 253
begin
SET @Diff = @CharCode - 178
IF @CharCode % 2 = 0
SET @CharCode = 1329 + @Diff / 2
ELSE
SET @CharCode = 1377 + (@Diff-1) / 2
END
ELSE
SET @CharCode = CASE @CharCode
When 162 Then 1415
When 163 Then 1417
When 164 Then 41
When 165 Then 40
When 166 Then 187
When 167 Then 171
When 168 Then 8212
When 169 Then 46
When 170 Then 1373
When 171 Then 44
When 172 Then 45
When 173 Then 1418
When 174 Then 8230
When 175 Then 1372
When 176 Then 1371
When 177 Then 1374
When 254 Then 1370
ELSE @CharCode
END
SET @Result = @Result + nchar(@CharCode)
SET @i = @i + 1
END
RETURN @Result
END
所以,我只是使用它,并通过Unicode字符集以这种方式获取数据:
\DB::connection('sqlsrv')->select('SELECT test.dbo.asf_ConvertANSIToUnicode(a.MTNAME)
FROM test.dbo.VMATERIALS a;');
在数据库设置中,我使用了以下配置:
'sqlsrv' => [
'driver' => 'sqlsrv',
'host' => env('MS_DB_HOST', 'localhost'),
'port' => env('MS_DB_PORT', '1433'),
'database' => env('MS_DB_DATABASE', 'forge'),
'username' => env('MS_DB_USERNAME', 'forge'),
'password' => env('MS_DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
],
感谢所有人。