Name Normalization Rules
When backing up Bubble data into a Postgres database like Supabase, PlanB needs to convert Bubble table and column names into a format Postgres can understand. This is called name normalization.
Think of it like translating street addresses into a standard format the postal service can understand — we're doing the same with database names.
Why we need it
Bubble lets you name tables and columns with:
- Emojis (🚀 ⭐ ❤️)
- Special characters ($, @, #, !)
- Spaces and mixed case
- International characters (é, ñ, ü)
Postgres has stricter rules. Identifiers must:
- Contain only letters, numbers, and underscores
- Start with a letter or underscore
- Not contain spaces or special characters
- Be case-insensitive (everything becomes lowercase)
How it works
Step 1 — Character-by-character translation
Each character in the name is examined and converted.
Emojis become descriptive words
- 🚀 →
rocket - 💰 →
money_bag - ⭐ →
star - ❤️ →
heart - 🔥 →
fire - 📊 →
bar_chart
Special characters become descriptive words
@→at#→hash$→dollar%→percent&→ampersand!→exclamation
Spaces become underscores
Spaces are replaced with underscores to connect words.
Step 2 — Unknown emojis
When the system encounters an emoji or character it doesn't recognise, it's assigned a unique number:
- 🦄 (unicorn) →
emoji_1 - 🦖 (dinosaur) →
emoji_2 - 🌈 (rainbow) →
emoji_3
Each unknown emoji gets its own number, so they remain distinct.
Step 3 — Cleanup
- Convert everything to lowercase
- Remove duplicate underscores (
__becomes_) - Trim underscores from the start and end
- Prepend an underscore if the name starts with a number
Examples
| Original | Converted | Explanation |
|---|---|---|
| 🚀 | rocket | Single emoji becomes its word |
| 💰 Money | money_bag_money | Emoji + word |
| Sales 📊 | sales_bar_chart | Word + emoji |
| ⭐⭐⭐ | star_star_star | Multiple emojis |
| 🏠 Home | house_home | Emoji with its meaning |
| Original | Converted | Explanation |
|---|---|---|
| $$$ Price | dollar_dollar_dollar_price | Dollar signs become words |
| Email@Company | email_at_company | @ becomes 'at' |
| #1 Product | hash_1_product | # becomes 'hash' |
| 50% Off | _50_percent_off | Starts with underscore for numbers |
| Q&A Section | q_ampersand_a_section | & becomes 'ampersand' |
| Original | Converted | Explanation |
|---|---|---|
| 🦄 Magic | emoji_1_magic | Unknown emoji gets number |
| 🦖 Ancient | emoji_2_ancient | Next unknown gets next number |
| 🌈 Colors 🦄 | emoji_3_colors_emoji_4 | Each unknown gets unique number |
| Original | Converted | Explanation |
|---|---|---|
| !!! URGENT !!! | exclamation_exclamation_exclamation_urgent_exclamation_exclamation_exclamation | All exclamations converted |
| User's Profile! | users_profile_exclamation | Apostrophe removed, ! converted |
| 💰💰💰 Big Sale | money_bag_money_bag_money_bag_big_sale | Multiple emojis handled |
| ⚡Fast⚡ | high_voltage_fast_high_voltage | Emoji on both sides |
| Café René | cafe_rene | Accented characters normalised |
Handling duplicates
When multiple Bubble tables or columns normalise to the same name:
| Original | Converted | Explanation |
|---|---|---|
| 🚀 Rocket | rocket | First one keeps simple name |
| 🚀 ROCKET | rocket_2 | Second gets number suffix |
| Rocket | rocket_3 | Third gets next number |
| rocket | rocket_4 | Fourth gets next number |
Edge cases
| Original | Converted | Explanation |
|---|---|---|
| (empty) | unnamed_table_1 | Empty names get default |
| unnamed_table_2 | Only whitespace gets default | |
| ### | hash_hash_hash | Only special characters |
| 1234 | _1234 | Numbers get underscore prefix |
| SELECT | select_ | SQL reserved word gets underscore suffix |
| from-to | from_to | Dash becomes underscore |
| 🦄🦖🌈 | emoji_1_emoji_2_emoji_3 | All unknown emojis |
Why this works
- Preserves meaning — “🚀 Launch Date” →
rocket_launch_dateis still readable. - Prevents errors — no database crashes from special characters.
- Handles everything — from emojis to international characters.
- Avoids conflicts — duplicate names automatically get numbered suffixes.
- Stays consistent — the same emoji always converts to the same word.
Summary
Name normalisation acts as a translator between Bubble's flexible naming and Postgres's strict requirements. It ensures every name is database-safe, names remain meaningful, and no data is lost due to naming issues.
Even with normalisation, you'll get a cleaner result if you prepare your Bubble app before migrating.
Need help? Email [email protected] or DM in the Bubble forum.