我在编写需要同时使用远程MS SQL数据库和本地MySQL数据库的php脚本时遇到了一些麻烦。 MS SQL数据库属于支持票证系统,我仅从该系统中读取数据。本地MySQL数据库用于存储有关支持通知单的其他信息。
我的问题与瑞典语字符å,ä和ö有关。在这两个数据库中,它们都正确存储,当使用HeidiSQL之类的DB GUI浏览表时可以看到它们。
但是当我从每个数据库中获取数据时,宪章的显示方式有所不同。
这是一个例子
<?php
//header('Content-Type: text/html; charset=utf8mb4');
header('Content-Type: text/html; charset=utf8');
$dbaddress ="localhost";
$dbuser="user_name";
$dbpass='user_password';
$dbh = mysqli_connect($dbaddress,$dbuser,$dbpass,'ism') or die(mysqli_error());
mysqli_query($dbh,"SET NAMES utf8");
mysqli_set_charset($dbh,"utf8");
$query="SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8')";
$result = mysqli_query($dbh, $query);
$query = "SELECT * FROM tickets WHERE partner ='Dia Falun & Västerås AB, Dialect' limit 1";
$result = mysqli_query($dbh, $query);
while($partner = mysqli_fetch_array($result)){
$partnername=$partner['partner'];
}
print "<p>$partnername</p>";
print "<p>Detected encoding: ".mb_detect_encoding($partnername)."</p>";
$user = 'user_name';
$pass = 'user_password';
$server = 'server_address';
$database = 'db_name';
$CharacterSet = "utf8";
//Upprätta anslutningen
$connection_string = "DRIVER={SQL Server};SERVER=$server;DATABASE=$database;CharacterSet=$CharacterSet";
$ism = odbc_connect($connection_string,$user,$pass);
$query="SELECT sitename FROM Incident WHERE incidentnumber=415521";
$result = odbc_exec($ism, $query) or die(odbc_errormsg());
while(odbc_fetch_row($result)){
$partner=odbc_result($result,'sitename');
}
print "<p>$partner</p>";
print "<p>Detected encoding: ".mb_detect_encoding($partner)."</p>"
?>
我不明白的是关于标题。在脚本的开头,我指定了字符集,如果将其设置为utf8,则可以正确显示MySQL数据库中的字符,但来自MS SQL的字符仅显示为``。 但是,如果我将字符集设置为utf8mb4,则情况正好相反。来自MS SQL数据库的字符是正确的,而来自MySQL数据库的字符则显示为“Ô,“ ¥”,具体取决于字符。
本地MySQL数据库中的排序规则设置为“ utf8_bin”。我也尝试将其更改为“ utf8mb4_bin”,但没有区别。
我认为这可能与我使用mb_detect_encoding()测试每个字符串的编码时得到的结果有关 对于本地数据库,我得到utf8,但是从MS SQL数据库返回的字符串没有任何结果。
如果有必要,我只能更改本地数据库的排序规则,没有对MS SQL数据库的管理员访问权限。
有人可以帮忙吗?