php - 如何从 Laravel MSSQL 数据库中读取亚美尼亚文本

标签 php sql-server laravel

当我在 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) 微软公司 Windows NT 6.1(内部版本 7601:Service Pack 1)上的标准版(64 位)

Table screenshot

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')

Query result

在我的 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

如果它对我有帮助,我该如何在查询中使用它?

如有任何帮助,我们将不胜感激。

最佳答案

在我的例子中,在我的数据库中,我有将 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' => '',
        ],

感谢大家。

关于php - 如何从 Laravel MSSQL 数据库中读取亚美尼亚文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53758060/

相关文章:

php - 使用mysql从多个表中选择

php - 为什么我的复选框没有选中?

php - 过滤掉两列等于一的行

javascript - Bootstrap/Laravel 不会加载 JavaScript

php - 如何在 Laravel Blade 中创建动态生成的下拉菜单

php - 即将到来的 SHA-256 : Do I need to update my IPN listener that does not use a secure URL?

sql - 从一个巨大的表中检索计数的更节省空间的方法

sql - 按名称分组的连续日期范围内的最小和最大日期

SQL - 将所有用户合并到一张表中

Laravel:重写 eloquent 函数以获得结果?