【问题标题】:How to retrieve wrong charset encoded strings?如何检索错误的字符集编码字符串?
【发布时间】:2020-12-26 19:50:52
【问题描述】:

在我的 PHP 脚本中,我使用以下代码与 MS SQL 数据库服务器建立了连接,

$connectionInfo = array( "Database"=>$database,"UID"=>$uid, "PWD"=>$pwd);
$conn = sqlsrv_connect( $serverName, $connectionInfo);

我确实忘记在$connectionInfo 中指定"CharacterSet"=>"UTF-8"。由于这个原因,一些西班牙语和其他字符被编码错误。例如,“álgebra”存储为“álgebra”。现在我已经在连接到数据库期间设置了正确的字符集,新数据将被正确存储。 但是如何恢复编码错误并已经存储的原始字符串?

【问题讨论】:

  • "但是如何恢复原来编码错误并已经存储的字符串呢?" 你不能,数据已经丢失了。您需要重新插入原始数据或UPDATE 现有行,同时引用原始源。
  • 没有什么算法可以恢复原字符串吗?
  • 不,没有算法或魔法可以恢复原始字符串。
  • 不正确代码页的数据丢失在很多方面与截断相同,@SamiulAlam。除非您在某处拥有原始信息的副本,否则丢失的数据将保持原样。

标签: php sql-server character-encoding special-characters


【解决方案1】:

您很可能没有丢失任何东西。只需将字符串/列转换为二进制,然后使用正确的编码从二进制转换为字符串。

--2019
select cast(0xC3A16C6765627261 as varchar(100));

declare @t table(thechar varchar(100) collate Latin1_General_100_CI_AI_SC_UTF8)
insert into @t (thechar) values (0xC3A16C6765627261);

select *
from @t;

【讨论】:

  • 这个排序规则给出了这个错误:Invalid collation 'Latin1_General_100_CI_AI_SC_UTF8'.
  • 看看stackoverflow.com/questions/28168055/… ...相当于Xabi的回答
  • @SamiulAlam 那应该是因为从 SQL Server 2019 开始支持 UTF8 排序规则
【解决方案2】:

有时我会使用这个小函数从 UTF8 进行转换,这可能会对您有所帮助:

create function FromUtf8(@src varchar(8000)) returns varchar(8000) as
begin
    declare @c char, @i int
    select @i = patIndex('%[ÂÃ][€-¿]%', @src collate Latin1_General_BIN)
    while @i > 0
        select  @c = char(((ascii(substring(@src, @i, 1)) & 31) * 64)
                         + (ascii(substring(@src, @i + 1, 1)) & 63)),
                @src = stuff(@src, @i, 2, @c),
                @i = patIndex('%[ÂÃ][€-¿]%', @src collate Latin1_General_BIN)
    return @src
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-08
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    相关资源
    最近更新 更多