Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

πρόβλημα με τονισμό στα queries

Îåêßíçóå áðü ôï ìÝëïò xterm. Τελευταία δημοσίευση από το μέλος xterm στις 06-11-2009, 17:37. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  06-11-2009, 14:32 54971

    πρόβλημα με τονισμό στα queries

    Γεια και χαρά συνάδελφοι,

    Έχω μια βάση εδώ με collation GREEK_CI_AS.

    Το query
    SELECT     ArchaeologicalSiteID, GeneralName
    FROM         ArchaeologicalSites
    WHERE     (GeneralName LIKE '%κανο%')

    δεν επιστρεφει τιποτα

    ενώ το query
    SELECT     ArchaeologicalSiteID, GeneralName
    FROM         ArchaeologicalSites
    WHERE     (GeneralName LIKE '%κανό%')

    Επιστρεφει το σωστο row από το table. Κοινώς πρόβλημα με τον τονισμό. Τα πεδία όλα ειναι σε varchar.
    Το AS στο GREEK_CI_AS δε σημαίνει ACCENT_SENSITIVITY. Άρα τι φταίει?

    γροικάσε μπάρμπα τ' αρνάκια!!
  •  06-11-2009, 15:27 54978 σε απάντηση της 54971

    Απ: πρόβλημα με τονισμό στα queries

    Αγαπητέ μου συνάδελφε

    Το ΑS στα ελληνικά αυτό ακριβώς σημαίνει άρα η συμπεριφορά είναι σωστή!

    δες  τα παρακάτω

     http://www.collation-charts.org/mssql/mssql.0408.1253.Greek_CI_AI.html

    http://www.collation-charts.org/mssql/mssql.0408.1253.Greek_CI_AS.html


    Antonios Chatzipavlis

  •  06-11-2009, 15:36 54980 σε απάντηση της 54971

    Απ: πρόβλημα με τονισμό στα queries

    To AS αυτό ακριβώς σημαίνει, ACCENT SENSITIVE. Αυτό σημαίνει ότι το 'o' και το 'ό' θεωρούνται διαφορετικοί χαρακτήρες. Συνεπώς το query κάνει αυτό ακριβώς που του είπες: επιστρέφει πεδία στα οποία περιέχεται το string 'κανο' όχι όμως και το 'κανό'.

    Αν θέλεις να επιστρέψεις και τις δύο μορφές θα πρέπει ή να αλλάξεις το collation του πεδίου GeneralName ή να ορίσεις ότι η σύγκριση θα γίνει με το GREEK_CI_AI στο query. Η πρώτη λύση θα επηρεάσει όλα τα query που χρησιμοποιούν το πεδίο αυτό οπότε μάλλον δεν σου κάνει. Η δεύτερη λύση απαιτεί να αλλάξεις το WHERE ως εξής:

    SELECT     ArchaeologicalSiteID, GeneralName
    FROM         ArchaeologicalSites
    WHERE     (GeneralName COLLATE GREEK_CI_AI LIKE '%κανό%')

    Επειδή υποψιάζομαι ότι το AS μπήκε κατά λάθος θα πρέπει να έχεις υπόψη ότι το collation της βάσης χρησιμιοποιείται ως default τιμή για τη δημιουργία πινάκων κλπ. και η αλλαγή του δεν επηρεάζει τους πίνακες που έχουν ήδη δημιουργηθεί. Η ίδια σχέση υπάρχει και μεταξύ πινάκων και πεδίων. Αν θέλεις να αλλάξεις το collation της βάσης θα πρέπει να αλλάξεις τα collations σε όλους τους πίνακες και πεδία. Θα ήταν ίσως ευκολότερο να φτιάξεις μία νέα βάση και να αντιγράψεις εκεί τα δεδομένα της παλιάς


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  06-11-2009, 17:37 54997 σε απάντηση της 54980

    Απ: πρόβλημα με τονισμό στα queries

    Όντως το ACCENT SENSITIVE αυτό σημαίνει ότι το 'o' και το 'ό' θεωρούνται διαφορετικοί χαρακτήρες. Έκανα λάθος. Πρέπει το collation να είναι GREEK_CI_AI.
    Μετά από λίγο ψάξιμο βρήκα ένα script για να αλλάζει όλα τα πεδία σε μια βάση στο επιθυμητό collation. Το script αρχικά ήταν για sql server 2000. Τώρα τρέχει για sql server 2005 μπορεί και για 2008 δεν το δοκίμασα. Προσοχή το script κάνει print τα sql alter column statements όχι execute. Το exec είναι σε σχόλια.
    DECLARE @@TableName Nvarchar(100)
    DECLARE @@ColumnName Nvarchar(100)
    DECLARE @@ColumnType NvarChar(100)
    DECLARE @@ColumnLengh FLOAT
    DECLARE @@SQL NvarChar(1000)
    DECLARE @@IsNullAble NvarChar(50)
    
    DECLARE my_cursor CURSOR FOR
    Select sysobjects.name From sysobjects Where xtype='u' OPEN my_cursor
    
    FETCH NEXT FROM my_cursor INTO @@TableName
    WHILE @@FETCH_STATUS = 0
    BEGIN
    DECLARE my_column CURSOR FOR
    select syscolumns.name,systypes.name as Type, syscolumns.length ,syscolumns.isnullable
    From syscolumns inner join sysobjects on sysobjects.id=syscolumns.id
    left outer join sys.extended_properties on sys.extended_properties.minor_id=syscolumns.colid and sys.extended_properties.major_id = syscolumns.id
    inner join systypes on syscolumns.xtype = systypes.xtype
    where sysobjects.xtype='u' And sysobjects.name=@@TableName And (systypes.name='nvarchar' or systypes.name='varchar' or systypes.name='ntext' or systypes.name='text')
    
    OPEN my_column
    FETCH NEXT FROM my_column INTO @@ColumnName,@@ColumnType,@@ColumnLengh,@@IsNullAble
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
    IF (@@IsNullAble=1)
    BEGIN
    Select @@SQL =( 'ALTER TABLE ' + @@TableName + ' ALTER COLUMN ' + @@ColumnName + ' ' + @@ColumnType + '(' + CAST(@@ColumnLengh as
    NVARCHAR) + ') COLLATE ' + ' GREEK_CI_AI NULL')
    END
    ELSE
    BEGIN
    Select @@SQL =( 'ALTER TABLE ' + @@TableName + ' ALTER COLUMN ' + @@ColumnName + ' ' +
    @@ColumnType + '(' + CAST(@@ColumnLengh as NVARCHAR) + ') COLLATE ' + ' GREEK_CI_AI NOT NULL')
    END
    
    PRINT(@@SQL)
    --EXEC(@@SQL)
    
    FETCH NEXT FROM my_column INTO @@ColumnName,@@ColumnType,@@ColumnLengh,@@IsNullAble
    END
    CLOSE my_column
    DEALLOCATE my_column
    
    FETCH NEXT FROM my_cursor INTO @@TableName
    END
    CLOSE my_cursor
    DEALLOCATE my_cursor
    GO


    γροικάσε μπάρμπα τ' αρνάκια!!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems