¿PostgreSQL puede crear una base de datos sensible a mayúsculas y minúsculas?


10

Estoy transfiriendo un código de alguna versión de Sybase a PostgreSQL. Esta es una aplicación C que utiliza la biblioteca de cliente Sybase. Mi enfoque es escribir una capa de traducción que traduzca las llamadas dbsqlexec()a PQexec()(por ejemplo). Esa parte está trabajando principalmente.

Parece que la base de datos Sybase está configurada en mayúsculas y minúsculas (con respecto a los nombres de los objetos de la base de datos). Por ejemplo, hay tanto una WIDGETtabla como una widgettabla. Parece que la convención en esta aplicación es que los nombres en mayúsculas indican las tablas de datos reales, mientras que los nombres en minúsculas se usan como tablas temporales cuando se ejecuta algún procesamiento.

De acuerdo con la Estructura léxica 4.1 , " Las palabras clave y los identificadores sin comillas no distinguen entre mayúsculas y minúsculas " . Sé que puedo hacer comillas dobles para deshabilitar el plegado automático en minúsculas, pero no quiero tener que hacerlo manualmente a través de los miles de millones de líneas. de código que usa esta base de datos.

¿Hay alguna manera de configurar PostgreSQL para deshabilitar este plegado automático de mayúsculas y minúsculas para los identificadores de objetos de la base de datos?

Mi alternativa será escribir un código que examine cada instrucción SQL y ponga comillas dobles alrededor de cada identificador (que no es una palabra clave).


Las palabras clave se pueden usar como identificadores si se citan dos veces, aunque no debería hacerlo. En cualquier caso, no puede estar seguro de que algunos identificadores de su base de código Sybase no sean palabras clave en PostgreSQL. Razón de más para citar los identificadores o, preferiblemente, cambiarles el nombre.
Erwin Brandstetter

los identificadores sin comillas en postgres en realidad no distinguen entre mayúsculas y minúsculas, se tratan como minúsculas. entonces tAbLeNaMe coincidirá con una sola tabla llamada tablename pero no con una llamada tableName. Me gustaría cambiar el nombre de las tablas porque de lo contrario la gente se olvidará el "y terminan accediendo a la versión en minúsculas por error.
JamesRyan

@JamesRyan: eso está mal. select * from TaBlEnAmEhará referencia a la misma tabla que select * from tablenameoselect * from TABLENAME
a_horse_with_no_name

@a_horse_with_no_name: si usted create table "tableName" (id integer primary key);, y luego create table "tablename" (id integer primary key);esta consulta select * from TaBlEnAmE;seleccionará de "nombre de tabla", no de "nombre de tabla". "Los nombres sin comillas siempre están doblados a minúsculas" .
Mike Sherrill 'Cat Recall'

Respuestas:


3

Terminé escribiendo un código que transforma el SQL generado por la aplicación en SQL compatible con PostgreSQL. Es bastante sencillo:

  • Divida la declaración en tokens sensibles, omitiendo los literales de cadena entre comillas simples
  • Comillas dobles cualquier cosa que no sea una palabra clave o número

También aproveché esta capa para transformar las llamadas isnulla coalesce. Hasta ahora está funcionando bastante bien.


uso comillas ("blahblablah") para que distinga entre mayúsculas y minúsculas ... funciona bien para mí ...
Anuj Patel

1

¿Hay alguna manera de configurar PostgreSQL para deshabilitar este plegado automático de mayúsculas y minúsculas para los identificadores de objetos de la base de datos?

No directamente. Es posible que pueda realizar un cambio relativamente menor en el código fuente de PostgreSQL y volver a compilarlo. (Comience en src / backend / parser / parser.c?) Pero me sorprendería si fuera muy simple.


Prefiero no meterme con el código fuente, ya que eso requeriría un cambio personalizado en la instalación de PostgreSQL cada vez que algo cambiara (host, versión, etc.), y las instalaciones binarias no estarían disponibles.
Greg Hewgill
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.