--- 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)