Database - Archiviare testi in cirillico, cinese e altre lingue con caratteri speciali

  • 06
  • Jul 2012
  • Dev @ Contech Lab
  • View: 17505 | 0 Comments

  • coldfusion.database | charset

  • Ieri ci siamo imbattuti in un problema nuovo. Non riuscivamo a memorizzare nel database le lingue in cirillico e giapponese. Dopo numerosi tentativi sulla modifica del charset utilizzato nelle nostre pagine applicative ci siamo resi conto che le specifiche più precise sull'utilizzo del charset UTF non davano nessun risultato.

    Sistema utilizzato: Apache httpd, ColdFusion8, MSSql Server 2000 o 2008.


    Le prime verificiche sono state fatte sull'utilizzo del charset UTF con la seguente specifica:

    view plain print about
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title></title>
    </head>

    Dopo numerose prove sul codice abbiamo deciso di intervenire sulla query. Abbiamo creato una tabella di prova chiamata T_TESTUNICODE con la seguente struttura:

    view plain print about
    T_TESTUNICODE 

    titolo nchar(50)
    titolontext ntext

    e un semplice FORM di inserimento:

    view plain print about
    <form action="unicode.cfm" method="post">
    Nuovo Testo : 
    <input name="titolo" type="text" size="35" maxlength="50"> 
    <input type="submit" value="Salva">
    </form>

    La query utilizzata inzialmente utilizzava il tag CFQUERYPARAM nel seguente modo:

    view plain print about
    <!--- query di test --->
    <cfparam name="db" default="myDatasource">

    <CFQuery DATASOURCE="#db#" name="Q_Insert">
        Insert INTO T_TESTUNICODE
        (titolo)
        VALUES
        (<cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#titolo#"> )
    </CFQUERY>

    Il risultato di questo metodo causava l'errore, in quanto il testo inserito nel form che poteva essere ad esempio questo: ????????????????

    veniva archiviato nel DataBase ma in modo errato, con il seguente risultato. Il testo contenuto nel database era : "??????????????????" Al termine dei TEST si è giunti alla conclusione che codice HTML, FORM e Application server erano impostati correttamente per il supporto dell'unicode. L'unica soluzione era quella di agire sulla Query. Con la seguente query si è arrivati alla corretta interpretazione del testo cirillico in fase di inserimento:

    view plain print about
    <cfparam name="db" default="myDatasource">
    <CFQuery DATASOURCE="#db#" name="Q_Insert">
        Insert INTO T_TESTUNICODE
        (titolo)
        VALUES
        (N'#titolo#'
    </CFQUERY>

    il cfqueryparam e' stato tolto e sostituito con il marcatore (N'#variabile#)

    La query indicata fornisce un supporto completo ai caratteri di tutte le lingue. La query tra l'altro è la stessa che viene generata dall'Enterprise Manager di MS quando si utilizza lo strumento di progettazione. Il Database su cui sono state condotte le prove sono MS Sql Server 2000 e MS Sql server 2008. I campi nel DB devono essere nchar o nvarchar o ntext e NON varchar, char ecc... e nella query di inserimento bisogna mettere il marcatore N' Coldfusion come impostazione di default è UTF-8 quindi non bisogna effettuare altri set particolarti. Riassumento il codice corretto utilizzato è il seguente:

    view plain print about
    <!--- // archiviazione caratteri lingue UTF-8 // --->
    <form action="unicode.cfm" method="post">
    Nuovo Testo : 
    <input name="titolo" type="text" size="35" maxlength="50"> 
    <input type="submit" value="Salva">
    </form>

    <cfif isdefined('form.titolo')>
    <cfparam name="db" default="myDatasource">
    <CFQuery DATASOURCE="#db#" name="Q_Insert">
        Insert INTO T_TESTUNICODE
        (titolo)
        VALUES
        (N'#titolo#'
    </CFQUERY>
    </cfif>

    <!--- // carica i dati e li mostra // --->
    <cfquery name="seluni" datasource="#db#" maxrows=100>
    select titolo from T_TESTUNICODE
    </cfquery>

    <cfoutput query="seluni">#titolo#<br></cfoutput>