接受的答案似乎能够完成任务;是的,您可以将其编码为
base64
,然后再解码回来,但是所有使用该远程数据库的应用程序都应更改并支持字段为
base64
编码。我的想法是,如果有一个远程MS SQL Server数据库,可能会有其他应用程序(或应用程序)使用它,因此该应用程序还必须更改以支持纯文本和
base64
编码。您还需要处理纯文本和
base64
转换文本。
我搜索了一下,并找到了如何使用MS SQL命令和PHP将UNICODE文本发送到MS SQL Server以将UNICODE字节转换为HEX数字的方法。
如果您查看mssql_fetch_array
的PHP文档http://php.net/manual/ru/function.mssql-fetch-array.php#80076的注释,您会看到一个相当不错的解决方案,将文本转换为UNICODE HEX值,然后像这样直接将该HEX数据发送到MS SQL Server:
将Unicode文本转换为HEX数据
$utf8 = 'Δοκιμή με unicode → Test with Unicode';
$ucs2 = iconv('UTF-8', 'UCS-2LE', $utf8);
$arr = unpack('H*hex', $ucs2);
$hex = "0x{$arr['hex']}";
mssql_query("INSERT INTO mytable (myfield) VALUES ({$hex})", $link);
现在所有的文本都以UNICODE格式正确地存储到
NVARCHAR
数据库字段中,这就是您需要做的一切,以便将其作为纯文本发送和存储而不进行编码。
要检索该文本,您需要请求MS SQL Server以以下方式发送回UNICODE编码的文本:
从MS SQL Server检索Unicode文本
// retrieving data from database
// IMPORTANT!
// please note that "varbinary" expects number of bytes
// in this example it must be 200 (bytes), while size of field is 100 (UCS-2 chars)
// myfield is of 50 length, so I set VARBINARY to 100
$result = mssql_query("SELECT CONVERT(VARBINARY(100), myfield) AS myfield FROM mytable", $link);
while (($row = mssql_fetch_array($result, MSSQL_BOTH)))
{
// we get data in UCS-2
// I use UTF-8 in my project, so I encode it back
echo '1. '.iconv('UCS-2LE', 'UTF-8', $row['myfield'])).PHP_EOL;
// or you can even use mb_convert_encoding to convert from UCS-2LE to UTF-8
echo '2. '.mb_convert_encoding($row['myfield'], 'UTF-8', 'UCS-2LE').PHP_EOL;
}
插入后的包含UNICODE数据的MS SQL表格
使用PHP页面显示值的输出结果
我不确定你是否能够访问我的测试页面,但你可以尝试查看实时结果:
http://dbg.deve.wiznet.gr/php56/mssql/test1.php