欢迎各位兄弟 发布技术文章
这里的技术是共享的
注意下面红色的字
如果您仍然希望继续使用ODBC连接MSSQL数据库,并且仍然遇到中文乱码问题,您可以尝试调整一些设置来解决问题。以下是一些可能的解决方法:
设置ODBC连接的字符集:您可以尝试在ODBC连接字符串中指定字符集,例如:
php
$dsn = "odbc:Driver={FreeTDS};Server=192.168.0.1;PORT=1433;Database={$database};UID=${uid};PWD=${pwd};TDS_Version=8.0;ClientCharset=UTF-8;"; $conn = new PDO($dsn);
设置ODBC连接的客户端字符集:您可以尝试在连接后运行查询来设置客户端字符集,例如:
php
$conn = new PDO($dsn); $conn->exec("SET NAMES 'utf8';");
检查数据库和表的字符集设置:确保数据库和表的字符集设置与PHP连接字符集一致,并且可以正确存储和显示中文字符。
如果尝试以上方法仍然无法解决乱码问题,请考虑对数据进行转换或处理,例如使用iconv
函数将字符从一种编码转换为另一种编码。
请注意,由于ODBC驱动和MSSQL数据库的兼容性限制,可能无法完全消除乱码问题。如果无法解决问题,考虑尝试其他连接方式或驱动程序以获得更好的中文字符支持。
对于中文字段 无须使用 iconv 或 mb_convert_encoding 等方法进行转换
下面是我自己亲自做的
function _one_ftp_list($ip)
{
$output = '';
$ftp_connection_infos = _get_ftp_connection_infos();
$uid = $ftp_connection_infos['uid'];
$pwd = $ftp_connection_infos['pwd'];;
$databases = get_mssql_databases();
$database = $databases[$ip];
$dsn = "odbc:Driver={FreeTDS};Server=192.168.0.1;PORT=1433;Database={$database};UID=${uid};PWD=${pwd};TDS_Version=8.0;ClientCharset=UTF-8;)";
$output .= "<a href='/ftp_list'>所有FTP列表</a>".' '.'FTP服务器的ip: '.$ip;
try {
$conn = new PDO($dsn);
$conn->exec("SET NAMES 'utf8';");
// $conn->query("SET TEXTSIZE -1");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT COUNT(LoginID) as total FROM [SUUsers]";
$stmt = $conn->prepare($sql);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
$total = $results[0]['total'];
$output .= '<br />';
$output .= "总计:".$total."个";
$sql = "SELECT LoginID,HomeDir,ExpiresOn, CONVERT(varchar, DATEADD(second, CAST(ExpiresOn AS bigint)+8*3600, '19700101'), 23) AS ExpiresOn_Human,
CONVERT(varchar, DATEADD(second, CAST(StatisticsStartTime AS bigint)+8*3600, '19700101'),23) AS StatisticsStartTime_Human
FROM [SUUsers] ORDER BY StatisticsStartTime DESC ";
$stmt = $conn->prepare($sql);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
$output .= '<br />';
$output .= '<br />';
$output .= '<table>';
$output .= '<tr>';
$output .= '<th>帐号</th>';
$output .= '<th>主目录</th>';
$output .= '<th>过期时间</th>';
$output .= '<th>创建时间</th>';
$output .= '<th>续期180天</th>';
$output .= '</tr>';
foreach($results as $key=>$value)
{
$expires_on = !empty($value['ExpiresOn'])?$value['ExpiresOn']:'';
if(!empty($expires_on)){
if((time()+24*3600)>=$expires_on){ // 为了安全 假如明天这个时候 > 过期时间,就算过期了
$error_style = "style='color:red'";
}else{
$error_style = "";
}
}
$output .= '<tr>';
$output .= "<td {$error_style}>{$value['LoginID']}</td>";
//无段下面的iconv 或 mb_convert_encoding 的 转换
// $output .= "<td {$error_style}>". iconv("GBK", "UTF-8", $value['HomeDir'])."</td>";
// $output .= "<td {$error_style}>". iconv('CP936', 'UTF-8//IGNORE', $value['HomeDir'])."</td>";
// $output .= "<td {$error_style}>".mb_detect_encoding( $value['HomeDir'], array("GBK","GB2312","BIG5","ASCII","UTF-8")). mb_convert_encoding($value['HomeDir'], 'UTF-8', 'CP936')."</td>";
$output .= "<td {$error_style}> {$value['HomeDir']}</td>";
$output .= "<td {$error_style}>{$value['ExpiresOn_Human']}</td>";
$output .= "<td {$error_style}>{$value['StatisticsStartTime_Human']}</td>";
$output .= "<td {$error_style}> <a href=\"javascript:ftp_renewal('{$value['LoginID']}','{$ip}');\" onclick=\"return window.confirm('确定要给{$value['LoginID']}续期180天吗?')\"> 续期</a> </td>";
$output .= '</tr>';
}
$output .= '</table>';
return $output;
} catch (PDOException $e) {
drupal_set_message('Connection failed: ' . $e->getMessage(),'error');
}
}
可能对 php.ini 的 mbstring 扩展的启用 也会起到作用吧
# vim /www/wdlinux/phps/56/etc/php.ini
........................................................................................
extension=php_mbstring.dll
........................................................................................