56 lines
1.7 KiB
Markdown
56 lines
1.7 KiB
Markdown
---
|
|
title: Use Lowercase Identifiers for Compatibility
|
|
impact: MEDIUM
|
|
impactDescription: Avoid case-sensitivity bugs with tools, ORMs, and AI assistants
|
|
tags: naming, identifiers, case-sensitivity, schema, conventions
|
|
---
|
|
|
|
## Use Lowercase Identifiers for Compatibility
|
|
|
|
PostgreSQL folds unquoted identifiers to lowercase. Quoted mixed-case identifiers require quotes forever and cause issues with tools, ORMs, and AI assistants that may not recognize them.
|
|
|
|
**Incorrect (mixed-case identifiers):**
|
|
|
|
```sql
|
|
-- Quoted identifiers preserve case but require quotes everywhere
|
|
CREATE TABLE "Users" (
|
|
"userId" bigint PRIMARY KEY,
|
|
"firstName" text,
|
|
"lastName" text
|
|
);
|
|
|
|
-- Must always quote or queries fail
|
|
SELECT "firstName" FROM "Users" WHERE "userId" = 1;
|
|
|
|
-- This fails - Users becomes users without quotes
|
|
SELECT firstName FROM Users;
|
|
-- ERROR: relation "users" does not exist
|
|
```
|
|
|
|
**Correct (lowercase snake_case):**
|
|
|
|
```sql
|
|
-- Unquoted lowercase identifiers are portable and tool-friendly
|
|
CREATE TABLE users (
|
|
user_id bigint PRIMARY KEY,
|
|
first_name text,
|
|
last_name text
|
|
);
|
|
|
|
-- Works without quotes, recognized by all tools
|
|
SELECT first_name FROM users WHERE user_id = 1;
|
|
```
|
|
|
|
Common sources of mixed-case identifiers:
|
|
|
|
```sql
|
|
-- ORMs often generate quoted camelCase - configure them to use snake_case
|
|
-- Migrations from other databases may preserve original casing
|
|
-- Some GUI tools quote identifiers by default - disable this
|
|
|
|
-- If stuck with mixed-case, create views as a compatibility layer
|
|
CREATE VIEW users AS SELECT "userId" AS user_id, "firstName" AS first_name FROM "Users";
|
|
```
|
|
|
|
Reference: [Identifiers and Key Words](https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS)
|