Portál AbcLinuxu, 9. listopadu 2025 13:32
Tentokrát snad přehledněji.
Podařilo se mi zprovoznit zobrazování dat z MSSQL serveru (Server2003, SQL2005) přes Freetds 0.82 do Apache/2.2.3 a PHP 5.1.6. na Centos5/2.6.18
Nedaří se mi překonat 2 překážky:
1. nesprávné kódování zobrazených dat nastavení:
-MSSQL - UTF-8/Czech_CI_AS
-freetds.conf - tds version=8.0 a client charset=UTF-8
-php.ini - default_charset = "utf-8" a mssql.charset = "utf-8"
-httpd.conf - AddDefaultCharset Off
-*.php - meta ...charset=utf-8
Asi mi něco uniká, ale prezentovaná data jsou stále ve Windows-1250.
2. zobrazení pole poznámky (ntext) příklad:
$vysledek2 = mssql_query("SELECT TOP 20 ID,SkupZbo,RegCis,Poznamka .....");while ($zaznam2 = mssql_fetch_array($vysledek2) ): ...
Dotaz funguje jen pokud tam není pole Poznamka, které je typu ntext. Jinak vznikne problém s kódováním nebo collation. Předpokládám, že bude nutná nějaká konverze, jen nevím jak se obdobné řeší.
Můžete někdo poradit, jak oba problémy překonat nebo nasměrovat na obdobné řešení. Předem dík.
mssql.charset="UTF-8", případně v php kódu ini_set("mssql.charset", "UTF-8");.UTF-8 velkými písmeny…)
/*
nastavit tyto volby nebo je nastavit v php.ini -------------------
*/
ini_set( 'mssql.charset', 'UTF-8' ); //charset
/*
Pokude nebude následující nastaveno, tak texty se normálně oříznou, bez nějaké chyby či varování.
Jestli se nepletu, tak nenastaveno (či '-1'), znamená jen 4KiB.
*/
ini_set( 'mssql.textlimit', '65536' );
ini_set( 'mssql.textsize', '65536' );
/*
¿Konverze datumů?
*/
//ini_set( 'mssql.datetimeconvert', '1 nebo 0' );
/*
------------------------------------------------------------------
*/
$con = mssql_connect(....);
@mssql_query("SET TEXTSIZE 65536", $con); //nastavit před selectem, postačuje 1× za sezení - možná nebude nutné
//asi je to ekvivalentem 'mssql.textsize' - nepamatuji si :(
//Pravděpodobně bude nutné u SQL dotazu přetypovat NTEXT a NVARCHAR např.:
$rs = mssql_query('SELECT TOP 20 ID,SkupZbo,RegCis,CAST(Poznamka AS TEXT)…');
Nápady jsem vyzkoušel, ale úspěch byl jen částečný:
ad.1. kódování$rs = mssql_query('SELECT TOP 20 ID,SkupZbo,RegCis,CAST(Poznamka AS TEXT) AS Poznamka …');
Přesto dík za pomoc, budu hledat dál.
Ještě doplním poslední zjištění k chybě kódování:
'AS' - to jsem už nedopisoval, to jsem nechal na Vás…, důležité je to CAST-ování
ini_set( 'mssql.charset', 'UTF-8' );// nebo/a v php.ini
ini_set( 'mssql.textlimit', '65536' );// nebo/a v php.ini
ini_set( 'mssql.textsize', '65536' );// nebo/a v php.ini
$con = mssql_connect(....);
@mssql_query("SET TEXTSIZE 65536", $con);
$rs = mssql_query('SELECT TOP 20 ID,SkupZbo,RegCis,Poznamka…');//bez CAST
?Takže úpravy nastavení ini_... nemají žádný vliv, v php.ini už to je zapsáno od minule.
S tou poznámkou mi to jinak než s CAST nefunguje.
Ohledně skutečného kódování stránky si samozřejmě jistý na 100% nejsem, ale v rámci svých možností jsem jinou možnost nezjistil. Stránka není nikde vystavená, je to jen na intranetu, přes wget neumím stránku sestavit tak, aby obsahovala i data z db.
Připojuji něco ze stránky, kterou jsem uložil ve Voknech z FF a ručně pročistil, je tam jen ta část, kolem dat z databáze- ty jsou v té tabulce.
Jelikož se jedná pouze o dvě pole, ve kterých jsou problematická data, tak jdu hledat něco pro překódování jen konkrétních polí před zobrazením, třeba to bude stačit.
K tomu kódování mě ještě napadá možnost, že jsem nějak nesprávně zkompiloval php s freetds, jen teď nevím, jak to oveřit.
Opět dík za trpělivost a rady.
Kódování jsem nakonec vyřešil překódováním až v php
echo "...".$zaznam2["RegCis"]."...";
echo "...".iconv('CP1250', 'UTF-8', $zaznam2['Nazev1'])."...";
echo "...".iconv('CP1250', 'UTF-8', $zaznam2['Poznamka'])."...";
Určitě to není ideální řešení, ale momentálně to splňuje účel, takže to zatím dál zkoumat nebudu.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.