Portál AbcLinuxu, 7. května 2025 06:34
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.