Ich habe diese Antwort nützlich gefunden: Accent and case insensitive COLLATE equivalent in Oracle, aber meine Frage bezieht sich auf LIKE Suche mit einer Version 9 Oracle db.Akzent und case insensitive Kollation in Oracle mit LIKE
Ich habe eine Abfrage wie folgt versucht:
SELECT column_name
FROM table_name
WHERE NLSSORT(column_name, 'NLS_SORT = Latin_AI')
LIKE NLSSORT('%somethingInDB%', 'NLS_SORT = Latin_AI')
aber keine Ergebnisse jemals zurückgegeben werden.
habe ich eine kleine Java-Datei-Test:
import org.apache.commons.dbcp.BasicDataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class DbCollationTest
{
public static void main(String[] args) throws SQLException
{
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
dataSource.setUrl("url");
dataSource.setUsername("usr");
dataSource.setPassword("pass");
Connection conn = null;
PreparedStatement createStatement = null;
PreparedStatement populateStatement = null;
PreparedStatement queryStatement = null;
PreparedStatement deleteStatement = null;
ResultSet rs = null;
try
{
conn = dataSource.getConnection();
createStatement = conn.prepareStatement("CREATE TABLE CollationTestTable (Name varchar(255))");
createStatement.execute();
String[] names = { "pepe", "pépé", "PEPE", "MEME", "mémé", "meme" };
int i = 1;
for (String name : names)
{
populateStatement = conn.prepareStatement("INSERT INTO CollationTestTable VALUES (?)");
populateStatement.setString(1, name);
populateStatement.execute();
}
queryStatement = conn.prepareStatement("SELECT Name FROM CollationTestTable WHERE NLSSORT(NAME, 'NLS_SORT = Latin_AI') LIKE NLSSORT('%pe%', 'NLS_SORT = Latin_AI')");
rs = queryStatement.executeQuery();
while (rs.next())
{
System.out.println(rs.getString(1));
}
deleteStatement = conn.prepareStatement("DROP TABLE CollationTestTable");
deleteStatement.execute();
}
finally
{
//DBTools.tidyUp(conn, null, rs);
//DBTools.tidyUp(createStatement);
//DBTools.tidyUp(populateStatement);
//DBTools.tidyUp(queryStatement);
//DBTools.tidyUp(deleteStatement);
}
}
}
Ich habe keinen Erfolg hatte googeln, jemand irgendwelche Lösungen?
Ich möchte eine Suche nach einem Teil eines Namens durchführen und Ergebnisse zurückgeben, die mit Groß-/Kleinschreibung und Akzent-Unempfindlichkeit übereinstimmen.
Danke für die Antwort, ist es trotzdem, es zu tun, ohne die Sitzung zu ändern? Andere Abfragen in derselben Sitzung erfordern möglicherweise die ursprünglichen NLS-Einstellungen. Prost. –
@Ed: Sie können die Sitzungsparameter speichern, bevor Sie die Abfrage ausführen (wählen Sie * aus nls_session_parameters aus) und dann nach der Abfrage zurückstellen. –
Ich habe dies getestet und alles sah gut aus, aber jetzt wird mir gesagt, dass NLS_SORT und NLS_COMP Lösung nur in Version 10 R2 unterstützt wird. Ich muss Oracle-Datenbanken mit mindestens Version 9 unterstützen. Ist die einzige Möglichkeit, die Groß-/Kleinschreibung und akzentunempfindliche Suche zu verwenden, Funktionen zu verwenden? –