Как читать армянские тексты из базы данных Laravel MSSQL

Когда я подключаюсь к базе данных MSSQL в среде Laravel и читаю данные из любой таблицы, я получаю что-то вроде этого:

«Ü» ÏÏ »ñ ¨ Ý» ñϳÝÛáõà »ñ»

Я храню армянские тексты в своей базе данных. Я пытался использовать много разных кодировок, но все еще не могу решить свою проблему.

Какой тип кодировок мне следует использовать?

Данные хранятся в 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)
17 июня 2011 00:54:03
Авторское право (c) Microsoft Corporation
Standard Edition (64-разрядная версия) в Windows NT 6.1 (сборка 7601: пакет обновления 1)

Скриншот таблицы

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

Если это может помочь, как я могу использовать его в запросе?

Любая помощь будет высоко оценен.

4

Решение

В моем случае я база данных, у меня есть функция для преобразования 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' => '',
],

Спасибо всем.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector