Προς το περιεχόμενο

ελληνικά από mssql μέσω php


kwstas_pap

Προτεινόμενες αναρτήσεις

Εχμ, μια πιθανή λύση (για εσένα, αλλά κόπος για αυτούς) είναι να σου φτιάξουν κάποια stored procedures στον mssql server και να αναλάβει αυτός "τοπικά" (εντός των windows) να κάνει το "collate transation".

 

Μπας και ...

 

Προσθήκη 1

 

Αυτή η πιθανότητα μου άρεσε...

"If you are having problems with freeTDS when trying to get access to unicode data from mssql, set 'tds version =7.0' at etc/freetds.conf"

Στο δικό μου παράδειγμα, τo tds version ήταν 4.2 και όταν το άλλαξα σε 7.0 ή 8.0 μου επέστρεψε όλα τα δεδομενα ώς "??????????????"

Με tds version = 5.0 δεν μπορεί να κάνει σύνδεση !!!

 

Προσθήκη 2

 

Με λίγη καλή θέληση όπως φαίνεται στην "Προσθήκη 1" κατάφερα να δώ και εγώ τα περίφημα "?????" καθώς και τα ποιό περίφημα "Ξ΄Ο�Ο�Ξ΄ Ο�Ξ΄Ο�Ο�Ξ΄Ο�Ο�Ο�Ξ΄Ο�"

 

Τα "?????" τα είδα όταν στο freetds.conf είχα:

tds version = 7.0 (και με το = 8.0) και δεν ήταν ορισμένο πουθενά το client charset

 

Τα "Ξ΄Ο�Ο�Ξ΄ Ο�Ξ΄" τα είδα όταν στο freetds.conf είχα:

tds version = 7.0 (ή 8.0) και

client charset = UTF-8

 

ξαναείδα Ελληνικά όταν έβαλα:

tds version = 7.0 (ή 8.0) και

client charset = ISO-8859-7

 

στο php δεν άλλαξα τίποτα (εκτός από ένα "cast(t1 as text) as t1" το οποίο ήταν για το nchar = unicode που μου βάραγε νωρίτερα)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μήπως ο linux server σου υποστηρίζει mono; Τότε, ίσως να γράψεις κανά script σε asp.net. Φαντάζομαι πως με asp.net ίσως έχεις καλύτερη τύχη να μετατρέψεις τους χαρακτήρες σου σε utf-8. Αν δεν ξέρεις asp.net βοηθάμε... ;)

 

Από την άλλη, ο mssql server που σε ταλαιπωρεί τόσο πολύ μήπως είναι από κάποιο website; Αν ναι, γράψε στον IIS τους ένα asp/asp.net script που απλά να φέρνει τα data σε ένα xml (στο encoding που θέλεις...) και εσύ να διαβάζεις το xml. Σίγουρα δεν είναι βέλτιστη η λύση, αλλά από το τίποτε...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

δεν μπορώ σε καμία περίπτωση να επέμβω στον mssql server..

 

σχετικά με το tds το configuration είναι αυτό:

 

 

# pool server, since the pool server supports only TDS 4.2.

[JDBC_42]

host = 192.138.151.39

port = 4444

tds version = 4.2

 

# The client connecting to the pool server will use this to find its

# listening socket. This entry assumes that the client is on the same

# system as the pool server.

[mypool]

host = 127.0.0.1

port = 5000

tds version = 4.2

 

# A typical Microsoft SQL Server 7.0 configuration

;[MyServer70]

; host = ntmachine.domain.com

; port = 1433

; tds version = 7.0

 

# A typical Microsoft SQL Server 2000 configuration

;[MyServer2k]

; host = ntmachine.domain.com

; port = 1433

; tds version = 8.0

 

# A typical Microsoft SQL Server 6.x configuration

[biblionet]

host = χχχ.χχχχχ.gr

port = 1433

tds version = 7.0

 

 

έχουμε τίποτα λάθος;

 

σ.σ. όπου "χχχ.χχχχχ.gr" είναι η βάση mssql

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Εγώ αυτά τα sections τα έκανα όλα remarks και πείραξα μόνο το "[global]" configuration στο παράδειγμά μου.

 

Από ότι βλέπω έχεις "tds version = 7.0"

ΆΝ ΙΣΧΥΟΥΝ οι δοκιμές που έκανα εγώ και σε εσένα, όταν το αλλάξεις σε "tds version = 4.2" ΜΠΟΡΕΙ και να παίξει.

 

Επισης, δοκίμασε να προσθέσεις το "client charset = ISO-8859-7" στο global conf ή στο section "[biblionet]"

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λοιπον, έχουμε και λέμε.

Μηχανή δοκιμών -> Virtual PC 2007->XP_sp3 φρεσκαδούρα, απάτητο λιβάδι (xp_sp3 αλλιώς δεν έπαιζε ο sql2005)

SQL Server: SQL 2005 Express (για συντομία παρακάτω sql2005)

 

Στον SQL2005 δεν έχει επιλογή για "SQL_Latin1_General_CP1253_CI_AI" στο setup

Για να πετύχεις το παραπάνω δαιμονισμένο collation πρέπει τα XP να έχουν Regional Settings = English (U.S), Location = English (U.S) και Language for Non Unicode programs = English (U.S)

Μόνο τότε και εφόσον επιλέξεις "Dictionary Order, case-insensitive, accent-insensitive, for use with the 1253 (Greek) Character Set" o server αποκτά το πολυπόθητο "SQL_Latin1_General_CP1253_CI_AI"

 

Και μετά από αυτόν τον δυστυχισμένο πρόλογο, μπορείς να μαντρέψεις το αποτέλεσμα ;

 

Ναι, ναι, ναι, μόνο σε εσένα συμβαίνει.

Έφτιαξα μια βάση (pipa2) με collation "Greek_CI_AI", ενα πίνακα όπως και πρίν με την γνωστή ποικιλία από πεδία και τύπους πεδίων και φυσικά h PHP τα έδειξε όλα κανονικά χωρις iconv, χωρίς κανένα άλλο "κόλπο".

 

Μήπως δεν φταίει ο δυστυχυσμένος SQL2005 και φταίει οτιδήποτε άλλο από την πλευρα σου;

 

Π.χ. στείσε ενα virtual box με ένα χημείο linux+xampp και δες αν και εκεί έχεις το ίδιο πρόβλημα.

 

Το δικό μου setup είναι (vmware) Mint7 + xampp 1.7.3a

 

 

Εγώ πάντως δεν κάνω άλλη δοκιμή, τα έφτυσα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ΑΡΧΙΚΑ 1000 ευχαριστώ που βοηθήσατε υπερ του δέοντως..

μπορεί να μην βρέθηκε λύση αλλά έγιναν πολύτιμες δοκιμές που σίγουρα βοηθάνε στην καλύτερη κατανόηση του προβλήματος..

 

Θα συνεχίσω τα πειράματα και ελπίζω σύντομα να καταφέρω να φτάσω στο πολυπόθητο σωστό αποτέλεσμα..

 

ΤΕΛΟΣ , ΣΑΣ ΕΥΧΑΡΙΣΤΩ και πάλι! :rolleyes:

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Άμα βρείς τι έφταιγε, κάνε ένα κόπο να ξαναμπείς και να μας πεις.

 

 

 

Υ.Γ.

Μήπως να δοκίμαζες και κανένα...

mssql_query("SET NAMES 'charset_name_here'");

mssql_query("SET CHARACTER SET 'charset_name_here'"

... πρίν τραβήξεις τα δεδομένα;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 3 εβδομάδες αργότερα...

τελικά δεν φταίει καθόλου το script..

είναι καθαρά θέμα configuration του server...

μόνο που δεν έχω μάθει ακόμα λεπτομέρειες..

 

κρίμα τον τόσο ιδρώτα/

 

ευχαριστώ και πάλι παιδιά

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 7 μήνες μετά...

Μεταξύ άλλων έπεσα κι εγώ πάνω σε αυτό το πρόβλημα με το encoding "τραβόντας" δεδομένα με php από mssql...

 

Μέσα στα πολλά που διάβασα έπεσα στα ακόλουθα thread που εν μέρει με βοήθησαν να λύσω το πρόβλημα και επιτέλους να δω το φως το αληθινό (τα Ελληνικά δλδ.):

 

http://social.msdn.microsoft.com/Forums/en-US/sqldriverforphp/thread/908b5424-c3c3-446e-bb2b-0d22d8b24b6d/ το δεύτερο post που οδηγεί εν τέλει σε αυτό:

 

http://social.msdn.microsoft.com/forums/en-US/sqldatabaseengine/thread/ba0ab13f-ab97-4eed-9551-1c21a1a84c1e/ το τρίτο post που δίνει τη λύση...

 

εν συντομία αυτό που λένε είναι ότι η php έχει κάποια προβλήματα στο να μετατρέπει τα Unicode που χρησιμοποιεί η mssql και η λύση που δίνουν είναι η αυτόματη μετατροπή μέσα από Adodb σύνδεσης με την εντολή στο connection $db = &ADONewConnection('odbc_mssql', NULL,'utf-8');

 

Μέχρι εδώ όλα καλά αλλά μόνο σε windows... Σε linux ακόμα δεν έχω καταφέρει να το φτιάξω κι εδώ ελπίζω κάποιος να μπορέσει να με βοηθήσει.

 

Ο κώδικας που χρησιμοποιώ για να συνδεθώ με Adodb και odbc στα windows είναι ο εξής:

 

>$db = &ADONewConnection('odbc_mssql', NULL,'utf-8');

$myDSN="DRIVER={SQL Server};".
"SERVER=xxx.xxx.xxx.xxx;".
"UID=xxxxxa;PWD=xxxxx;".
"DATABASE=xxxxxxx;";

 

ενώ στα linux ο ακόλουθος:

>
$db = &ADONewConnection('odbc_mssql');

$myDSN="DRIVER=FreeTDS;" .
"SERVER=xxx.xxx.xxx.xxx;" .
"UID=xxxxx;PWD=xxxxx;" .
"DATABASE=xxxxxxxx;";

 

Ουσιαστικά η μόνο διαφορά είναι ο driver. Σύνδεση έχω κανονική και τη βάση, το query λειτουργεί αλλά έχω το γνωστό θέμα με τα Ελληνικά.

 

Στο δεύτερο link που έδωσα πιο πάνω υπάρχει μια αναφορά ότι ο τρόπος αυτός μάλλον δουλεύει μόνο σε Windows αλλά δε μπορώ να το πιστέψω. Νομίζω πως κάποιο configuration πρέπει να κάνω στον FreeTDS αλλά δεν ξέρω καν τι και πως να πειράξω.

 

Ελπίζω κάποιος που να έχει ανάλογη εμπειρία να μπορεί να βοηθήσει...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αχα, δεύτερος γύρος...

 

Άν και φαίνεται ότι ήδη έχεις φάει το internet με το κουτάλι για να βρείς λύση, για δοκίσασε και το παρακάτω.(πηγή)

I worked on a project with a MS SQL server 2008 containing data of NVARCHAR type in multiple languages,

including asian characters. It is a known issue, that the PHP MSSQL functions are not able to retrieve

unicode data form NVARCHAR or NTEXT data fields.

 

I spent some time searching for possible solutions and finaly found a work arround, that provides correct

display of latin and asian fonts from a NVARCHAR field.

 

Do a SQL query, while you convert the NVARCHAR data first to VARBINARY and then to VARCHAR

 

SELECT

CONVERT(VARCHAR(MAX),CONVERT(VARBINARY(MAX),nvarchar_col)) AS x

FROM dbo.table

 

While you fetch the result set in PHP, use the iconv() function to convert the data to unicode

 

<?php $x = iconv("UCS-2LE","UTF-8",$row['x']); ?>

 

Now you can ouput the text to UTF-8 encoded page with the correct characters.

 

This workarround did run on IIS 6.0 with PHP 5.2.6 running as FastCGI.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δοκίμασε στην MySQL το πεδίο που θες να έχει ελληνικά

 

Column Charset: utf8

Column Collate: utf8_general_ci

 

και στην σύνδεση με την βάση από την PHP δοκίμασε τα εξής:

 

>
$db_addr = '';	// address of MySQL server.
$db_user = '';  // Username to access server.
$db_pass = '';  // Password access server.
$db_name = '';	// Name of database to connect to.
$connect = @mysql_connect("$db_addr", "$db_user", "$db_pass", 'true', 131072);

mysql_query('set character set greek',$connect);
mysql_query("SET NAMES 'utf8'",$connect);

 

Είχα και γω ακριβώς το ίδιο πρόβλημα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καταρχήν ευχαριστώ και τους δυο σας για τις απαντήσεις.

 

@rpz0r: μακάρι να είχα να κάνω με mysql... δεν νομίζω ότι αυτά τα functions υπάρχουν για mssql. δοκίμασε αλλά μου βγάζει error messages.

 

@At0m0: δεύτερος γύρος αλλά είναι λίγο πιο επιτυχημένος:) Άσε γιατί έχω βρει το μπελά μου με αυτό το θέμα...

 

Τώρα τι θέλει όμως να πει ο ποιητής με το "Do a SQL query"? Που ακριβώς να το κάνω αυτό.

 

Το query μου π.χ. είναι

>$query = "SELECT cardname, cardcode from OCRD";

Αυτό που λέει αυτός

>SELECT
CONVERT(VARCHAR(MAX),CONVERT(VARBINARY(MAX),nvarchar_col)) AS x
FROM dbo.table 

που το τρέχω? Δοκίμασα να το βάλω μόνο του πριν αλλά μου έβγαλε error "Warning: mssql_query(): message: Incorrect syntax near the keyword 'table'"

 

Βέβαια προσπαθώ στο Linux κι όχι στον IIS που δουλεύει κανονικά με τον άλλο τρόπο.

 

 

*****Καινούργιο μνμ έγραψα αλλά μου το έβαλε στο ίδιο*****

 

Γράψε άκυρο στο παραπάνω, ΔΟΥΛΕΨΕ!!!!!!

 

Έχω καιρό να ασχοληθώ με την SQL, έχω "κάψει" με το θέμα και κόλλησα.......

 

Λοιπόν έαν π.χ. το query είναι το

>"SELECT cardname, cardcode from OCRD";

με το cardname το πεδίο που έχει τα ελληνικά με NVARCHAR τότε το query πρέπει να γίνει

 

>"SELECT CONVERT(VARCHAR(MAX),CONVERT(VARBINARY(MAX),cardname))AS x, cardcode from OCRD";

Μετά πρέπει να κάνουμε iconv στο x που πλέον έχει τα στοιχεία που θέλουμε

 

>$x = iconv("UCS-2LE","UTF-8",$row['x'])

και τέλος να δούμε στην οθόνη τα Ελληνικά!!!!

 

Ο τρόπος αυτός είναι πολύ καλύτερος από αυτό που είχα βρει εγώ εχτές. Καταρχήν, δεν έχει να κάνει με drivers, άρα δουλεύει και σε linux και οπουδήποτε χωρίς configuration κλπ (αφού βασίζεται σε built-in php εντολές), αλλά και εκτελεί και πιο γρήγορα τα statements για τον ίδιο λόγο.

 

Απλά ένα τελευταίο που μου έφαγε αρκετή ώρα σήμερα. Στα query που περνάνε δεδομένα προς τον server πρέπει οπωσδήποτε πριν από δεδομένα που είναι Ελληνικά το N π.χ.

 

>$query = "SELECT cardcode, cardname from OCRD WHERE cardname=N'ελληνικά'

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 7 χρόνια αργότερα...
Δημοσ. (επεξεργασμένο)

Αν και παλιό το νήμα γράφω και την δική μου εμπειρία μιας και ήρθα αντιμέτωπος με το ίδιο πρόβλημα μέχρι αγανάκτησης. Κανένα απο τα παραπάνω δεν δούλεψε σε 'μενα. 
Windows server με iis 6
php 5.6
MS SQL 2014 v12 κάτι.

Database collation: Greek_100_CI_AS_KS_WS

Πώς είδα ελληνικά.

Στο ερώτημα όλα τα πεδία με τα κείμενα είχαν την παρακάτω σύνταξη.

SELECT convert(varbinary(max), PROGRAM.TITLE) as tlt FROM PROGRAM

Στην php το κείμενο καταχωρείτε στη μεταβλητή όπως παρακάτω

 $title = mb_convert_encoding((string)$row[0], 'UTF-8', 'UCS-2LE');

Επίσης δουλευει το ίδιο και η παρακάτω σύνταξη

 $title = iconv("UCS-2LE", "UTF-8", (string)$row[6]);

 

Μόνο με αυτό τον τρόπο είδα ελληνικά.

Το παράξενο είναι πως σε windows με  apache στο ερώτημα χρησιμοποιούσα το όνομα του πεδίου μόνο χωρίς καμιά μετατροπή μέσα στο ερώτημα. Δηλαδή

SELECT PROGRAM.TITLE FROM PROGRAM

και η καταχώρηση 

$title = iconv("Windows-1253", "UTF-8", $row[0]);

 

Η παραπάνω λύσεις δουλεύουν και σε iis και σε apache.

Επεξ/σία από bazzil
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...