Vertica ODBC charset Windows VS Linux
We're having a bit of trouble developing our PHP application using Vertica. Since an image is worth a thousand words, let's say we have the current code:
if(PHP_OS == "Linux")
$c = new PDOVertica("Driver=/opt/vertica/lib64/libverticaodbc.so;Server=192.168.1.49;Port=5433;Database=flexgroup;", "user", "password");
else
$c = new PDOVertica("Driver=Vertica;Server=192.168.1.49;Port=5433;Database=flexgroup;Server_CSet=UTF-8", "user", "password");
$sql = "SELECT NoClient, NomClient FROM tblclients ORDER BY NomClient";
$stmt = $c -> prepare( $sql );
$stmt -> execute();
while($res = $stmt -> fetch(PDO::FETCH_ASSOC))
{
echo $res['NomClient'];
}
This straightforward piece of code works and outputs the name of our clients almost correctly (if anyone's curious, the PDOVertica class is a homemade wrapper we built to bypass a bug where PDO loses parameter values. It calls the corresponding ODBC functions).
Anyway, the problem comes with accented characters. In order to output them correctly on our development machines, which run windows, we have to do the following
echo utf8_encode($res['NomClient']);
Now this wouldn't be a problem if both production and development environments worked the same way... but of course, they don't. In production, using utf8_encode garbles the string and we instead have to do this for the same string to come out correctly:
echo $res['NomClient'];
The problem here is that our development environment is Windows and the production servers are Linux. We're suspecting the driver detects the OS on which it's installed and does silent conversions, which explains why we need to wrap the calls in Windows and not in Linux. The question is then... is there a way to prevent that and always have results in UTF8?
Thanks in advance,
Tobbi
if(PHP_OS == "Linux")
$c = new PDOVertica("Driver=/opt/vertica/lib64/libverticaodbc.so;Server=192.168.1.49;Port=5433;Database=flexgroup;", "user", "password");
else
$c = new PDOVertica("Driver=Vertica;Server=192.168.1.49;Port=5433;Database=flexgroup;Server_CSet=UTF-8", "user", "password");
$sql = "SELECT NoClient, NomClient FROM tblclients ORDER BY NomClient";
$stmt = $c -> prepare( $sql );
$stmt -> execute();
while($res = $stmt -> fetch(PDO::FETCH_ASSOC))
{
echo $res['NomClient'];
}
This straightforward piece of code works and outputs the name of our clients almost correctly (if anyone's curious, the PDOVertica class is a homemade wrapper we built to bypass a bug where PDO loses parameter values. It calls the corresponding ODBC functions).
Anyway, the problem comes with accented characters. In order to output them correctly on our development machines, which run windows, we have to do the following
echo utf8_encode($res['NomClient']);
Now this wouldn't be a problem if both production and development environments worked the same way... but of course, they don't. In production, using utf8_encode garbles the string and we instead have to do this for the same string to come out correctly:
echo $res['NomClient'];
The problem here is that our development environment is Windows and the production servers are Linux. We're suspecting the driver detects the OS on which it's installed and does silent conversions, which explains why we need to wrap the calls in Windows and not in Linux. The question is then... is there a way to prevent that and always have results in UTF8?
Thanks in advance,
Tobbi
0
Comments
Thanks in advance
P.S. Corrected my original encoding. It turns out ISO-8859-1 and UTF-16 intersect as far as letters and numbers are concerned, which is why I made this mistake. Anyway, sorry for this slight confusion.