Sample Data Generator

Rows of believable but entirely made-up data — names, emails, dates — for filling a demo, a test or an empty spreadsheet. Start it from the same seed number and exactly the same rows come back, which matters when a test has to repeat.

How to use it

Columns are described one per line as a name and a type separated by a colon — joined:date, say — and a bare type on its own works too when the column name does not matter.

  1. List your columns One per line. "email:email" names the column and picks the type; "email" on its own does both.
  2. Pick a type for each id, uuid, firstname, lastname, fullname, email, phone, town, address, postcode, company, product, price, quantity, number, decimal, boolean, status, date, datetime, sentence, url, ip.
  3. Choose how many rows Up to two thousand at a time.
Full instructions
Same seed, same rows
For SQL inserts

Columns, one per line

Sample data

In depth

Generating believable test data for demos, fixtures and seed scripts

Every developer needs fake rows sooner or later: a demo that looks real without being real, a test fixture that stays the same across runs, or a seed script for a fresh database. This guide covers every column type the generator supports, explains the seed mechanism, walks through a worked example that produces SQL inserts, and lists the traps that catch people building fixtures for the first time.

Screenshot: About the sample data generator
About the sample data generator as it appears when the page opens.

What the generator does and who it is for

The page takes a list of column definitions and produces rows of invented but plausible data. The output can be CSV for a spreadsheet, JSON for an API stub, SQL INSERT statements for a database seed, or a Markdown table for pasting into documentation.

Developers use it when they need a table that looks like production without containing real people. Designers use it to fill a mockup with data that has realistic lengths and variety, so a prototype looks convincing in a client presentation. Teachers use it to create exercise datasets for students without borrowing real records. Testers use it to generate edge cases like apostrophes in names or very long addresses. Technical writers use it to build example tables for documentation. Anyone who has ever typed John Doe into twenty rows of a spreadsheet and wished there was a faster way will find this useful.

Defining columns

The left panel is labelled Columns, one per line. Each line names a column and gives it a type, separated by a colon. Writing name:fullname creates a column called name whose values are generated full names. Writing email:email creates a column of email addresses. If the name and the type are the same word, you can write just the word on its own, so email on a line by itself is the same as email:email.

The available types cover the most common fields in application data. Personal details include firstname, lastname, fullname, email and phone. Location types include town, address and postcode. Business types include company, product, price and quantity. General types include id, uuid, number, decimal, boolean, status, date, datetime, sentence, url and ip. If you type a name that does not match any known type, the generator falls back to producing a sentence.

The output format and its options

The dropdown labelled Output offers four choices. CSV produces comma-separated rows with a header line. JSON produces an array of objects where each key is a column name. SQL inserts produces one INSERT INTO statement per row, using the table name from the Table name field. Markdown table produces a pipe-and-dash table ready to paste into a document.

Header row in CSV is on by default. Turn it off when you need raw data rows without a header, which some import tools expect.

Table name sets the SQL table name used in INSERT statements. It defaults to sample_data and can be changed to whatever your schema uses.

The seed and why it matters

The Seed field takes a number. The generator uses this number to start its random sequence, which means the same seed with the same column definitions always produces exactly the same rows. Change the seed and you get a completely different set.

This matters for test fixtures. If a test relies on specific values, recording the seed alongside the fixture means anyone can regenerate the same data months later. Without a seed, a fixture that changes on every run makes a failing test impossible to reproduce.

The Rows field sets how many rows to generate. It accepts a number between one and two thousand. Beyond two thousand the browser textarea becomes sluggish, and at that scale a scripting approach is usually a better fit.

How names and emails relate

If you define a fullname column before an email column, the generated email address is built from that name. An email next to a name of Priya Sharma might read priya.sharma@example.com rather than a random string. This detail matters because test data where the email has nothing to do with the name beside it is an instant tell that the data is fabricated.

The names themselves are assembled from syllables rather than taken from a list of real people. The email domains are the reserved example domains that can never belong to anybody. This means the generated data cannot accidentally match a real person's name and email, which avoids the legal and ethical problems that come with test data landing in a bug report or a screenshot.

A worked example: seeding a customer table with SQL

Suppose you are building an order management system and need a customers table with five columns: id, name, email, city and joined. In the left panel, write five lines: id:id, name:fullname, email:email, city:town, joined:date.

Set Output to SQL inserts. Change Table name to customers. Set Rows to five and leave the seed at one. The right panel now shows five INSERT INTO customers statements. Each row has an auto-incrementing id, a plausible name, an email address built from that name, a town, and a date.

Copy the output and paste it into a migration script or run it directly against a development database. The next developer who clones the project can regenerate the same five rows by using seed one with the same column definitions.

Types and how they affect quoting

The type of a column controls more than the kind of value it produces. It also controls how the value is quoted in the output. In SQL, numeric columns like id, price, quantity, number and decimal are written without quotes. Boolean columns produce true or false without quotes. Everything else is wrapped in single quotes with any internal apostrophe doubled, which is how SQL escapes a literal quote.

In JSON the same distinction applies: numbers and booleans are written as bare values, and strings are wrapped in double quotes with internal characters escaped. In CSV everything is text, and fields that contain commas or quotes are wrapped in double quotes following the standard quoting rules.

Mistakes that produce unusable fixtures

A few errors come up often when generating test data for the first time.

  • Forgetting to note the seed. Without it you cannot regenerate the same rows, and a test that depends on specific values will break the next time someone runs the generator.
  • Using the wrong type for a column. A price column typed as number produces integers without decimal places. Use price or decimal for monetary values.
  • Generating more rows than the use case needs. Five rows demonstrate a feature. Fifty stress-test a query. Two thousand are rarely necessary for a demo.
  • Pasting SQL inserts into a production database. The table name defaults to sample_data, but if you changed it to your real table name and ran the output against the wrong connection string, real data would sit beside fake data.

When this generator is not enough

The generator covers the most common column types for application data. It does not produce geospatial coordinates, images, binary blobs, or data that follows a specific statistical distribution. For those, a scripting library like Faker in Python or a purpose-built data generation tool gives you full control.

It also does not generate related tables. If your schema has a customers table and an orders table with a foreign key between them, this page can make each table separately but cannot ensure the foreign keys line up. For relational fixtures, a seed script that generates the data programmatically is the safer choice.

Privacy and how the generation works

The rows are generated entirely inside the browser on your own device. Nothing is uploaded, there is no account, and the page works offline once it has loaded. The generation algorithm runs in the page's own code with no network calls.

Because no real names, addresses or emails are used, and the domains are reserved example ones, the output is safe to share in screenshots, documentation and issue trackers without a privacy review. That is the whole point of generated data: it looks real enough to be useful and is fake enough to be harmless. There is no limit on how many times you can generate, no registration required, and the ads on the page are what keep the site running.

Help

About the sample data generator

Columns are described one per line as a name and a type separated by a colon — joined:date, say — and a bare type on its own works too when the column name does not matter. Whatever you ask for comes back as CSV, JSON, SQL insert statements or a Markdown table.

List your columns

One per line. "email:email" names the column and picks the type; "email" on its own does both.

Pick a type for each

id, uuid, firstname, lastname, fullname, email, phone, town, address, postcode, company, product, price, quantity, number, decimal, boolean, status, date, datetime, sentence, url, ip.

Choose how many rows

Up to two thousand at a time.

Choose the output

CSV for a spreadsheet, JSON for an API stub, SQL to seed a table, Markdown to paste into a document.

Keep the seed if you want the same rows again

Change it for a different set.

Runs on your device

The rows are generated inside this page. Nothing is uploaded, there is no account, and once the page has loaded it works offline.

Good to know

The same seed gives the same rows

Test data that changes on every reload makes a failing test impossible to reproduce. Note the seed alongside your fixture and you can regenerate exactly the same rows a year later.

The email matches the name beside it

Put a fullname column before an email column and the address is built from that name. An address with nothing to do with the name next to it is the tell that data was faked carelessly.

None of it belongs to a real person

Names, towns and companies are built from syllables rather than taken from a list of real people, and the domains are the reserved example ones. Test data that happens to be somebody’s actual name and address is a liability the moment it lands in a ticket.

Types decide the quoting

Numeric and boolean columns are written unquoted in SQL and as real numbers in JSON. Everything else is quoted and escaped, so an apostrophe in a name will not break your insert.

Common questions

What types can I use?
id, uuid, firstname, lastname, fullname, email, phone, town, address, postcode, company, product, price, quantity, number, decimal, boolean, status, date, datetime, sentence, url and ip. An unrecognised type falls back to a sentence.
Why do I get the same rows every time?
That is deliberate. The generator is seeded so a fixture is reproducible. Change the seed for a different set of rows.
Are the names real people?
No. They are assembled from syllables, and the email domains are the reserved example ones that can never belong to anybody.
Will an apostrophe break my SQL?
No. Text values are quoted and any apostrophe is doubled, which is how SQL escapes one.
How many rows can I make?
Up to two thousand in one go. Beyond that a browser textarea becomes unpleasant to work with, and a real seeding script is a better tool.
Is any of this uploaded?
No. It is all generated by your own browser and never leaves the device.
Is it free?
Yes, with no account and no limit on how much you generate. Ads on the page pay for the site.