【发布时间】:2019-02-19 22:42:36
【问题描述】:
我有一个带有 SQL_Latin1_General_CP1_CI_AS 排序规则的数据库,我需要将其转换为 utf8_unicode_ci 排序规则。改变表格不是一种选择。 MSSQL 返回数据如下:
[FirstName] => ??????????
但是像这样的真实数据:
[FirstName] => مریم
我已经尝试了这些方法:
$utf8[] = utf8_encode($saleagent['FirstName']);
$utf8[] = iconv('ISO-8859-1', 'UTF-8',$saleagent['FirstName']);
$utf8[] = mb_convert_encoding($saleagent['FirstName'], 'UTF-8', 'ISO-8859-1');
输出是:
Array
(
[0] => ??????????
[1] => ??????????
[2] => ??????????
)
有没有办法将现有数据转换为utf8_unicode_ci?
编辑
根据this answer,我改了代码:
在 SQL 中:
CAST(p.FirstName AS VARBINARY(MAX)) as FirstName,
在 PHP 中我写了这个函数来修复编码:
public function fixEncoding($string)
{
$original = $string;
$string = trim($string);
// Detect the input string encoding.
$encoding = mb_detect_encoding($string, mb_detect_order(), false);
if ($encoding == 'UTF-8' || $encoding == false) {
$hex = bin2hex($string);
$str = "";
for ($i = 0; $i < strlen($hex) - 1; $i += 2) {
$str .= chr(hexdec($hex[$i] . $hex[$i + 1]));
}
$string = iconv('UCS-2LE', 'UTF-8', $str);
return $string;
} elseif ($encoding == 'ASCII') {
$string = $original;
return $string;
}
return $string;
}
让我解释一下情况。
我在mssql 数据库中遇到了 3 种类型的字符串:
- 英文字符或数字等字符串:
xyz 32 - - 类似波斯字符的字符串:
مریم دختر خوبی است - 上述两个字符串:
مریم دختر خوبی است - Maryam is a good girl.
发生的情况是,1 和 2 中的代码转换成功。但是,数字 3 在尝试将其转换为 iconv 时返回错误,并引发以下错误:
iconv():在输入字符串中检测到不完整的多字节字符
在这一行:
$string = iconv('UCS-2LE', 'UTF-8', $str);
你有任何解决方案来处理这三种情况吗?
【问题讨论】:
-
是
varchar还是nvarchar列?运行相同的选择时 SSMS 显示什么? -
它是 nvarchar 。我在 ubunto 上运行我的项目;所以我没有 SSMS,但我有 dataGripe,它可以很好地显示数据。 @IvanStarostin
-
那么数据就好了。
Collation影响值的比较及其排序。所以问题只在 PHP 方面。
标签: php sql-server collation iconv