加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 19:40:56 所属栏目:大数据 来源:网络整理
导读:当我连接到Laravel框架中的MSSQL数据库并从任何表中读取数据时,我得到如下内容: “ü????? ¨ Y???3Y?á???? “ 我将亚美尼亚文本存储在我的数据库中.我试过使用许多不同的字符集,但我仍然无法解决我的问题. 我应该使用什么类型的字符集? 数据存储在varcha
当我连接到Laravel框架中的MSSQL数据库并从任何表中读取数据时,我得到如下内容:

“ü????? ¨ Y???3Y?á???? “

我将亚美尼亚文本存储在我的数据库中.我试过使用许多不同的字符集,但我仍然无法解决我的问题.

我应该使用什么类型的字符集?

数据存储在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','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上的标准版(64位)(Build 7601:Service Pack 1)

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,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,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 charset获取数据:

DB::connection('sqlsrv')->select('SELECT test.dbo.asf_ConvertANSIToUnicode(a.MTNAME) 
    FROM test.dbo.VMATERIALS a;');

在我的数据库设置中,我使用了这个配置:

'sqlsrv' => [
            'driver' => 'sqlsrv','prefix' => '',],

谢谢大家.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读