From 204a4c089d7b386fd3de4c7610b681491d5b3a13 Mon Sep 17 00:00:00 2001
From: Andrew Paseltiner <apaseltiner@chromium.org>
Date: Mon, 17 Mar 2025 15:58:40 -0700
Subject: [PATCH] Avoid transient std::string construction when deserializing
 from database

Various base APIs accept a std::string_view and do not need ownership of
a std::string, so sql::Statement::ColumnStringView can be used instead.

Examples of affected callsites include UUID/JSON/proto parsing, string
splitting, and literal string comparisons.

Bug: 403218784
Change-Id: I9d5a25065958f7536e76e6b0333b90ef1e1f5f9a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6362935
Owners-Override: Daniel Cheng <dcheng@chromium.org>
Reviewed-by: Daniel Cheng <dcheng@chromium.org>
Commit-Queue: Daniel Cheng <dcheng@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1433834}
---
 .../local_image_search/annotation_storage.cc  | 14 ++++-----
 .../local_image_search/documents_table.cc     |  8 ++---
 .../browser/diagnostics/sqlite_diagnostics.cc |  2 +-
 .../activity_log/counting_policy.cc           |  4 +--
 .../activity_log/fullstream_ui_policy.cc      |  4 +--
 chrome/utility/importer/firefox_importer.cc   |  8 +++--
 .../core/browser/sql_table_builder.cc         |  6 ++--
 .../addresses/address_autofill_table.cc       |  8 ++---
 .../webdata/autofill_ai/entity_table.cc       |  6 ++--
 .../webdata/autofill_sync_metadata_table.cc   |  4 +--
 .../payments/payments_autofill_table.cc       |  2 +-
 .../history/core/browser/download_database.cc |  4 +--
 .../history/core/browser/history_database.cc  |  8 ++---
 .../sync/history_sync_metadata_database.cc    |  2 +-
 .../history/core/browser/url_database.cc      |  4 +--
 .../browser/visit_annotations_database.cc     | 12 ++++----
 .../core/browser/visit_annotations_database.h |  5 ++--
 .../history/core/browser/visit_database.cc    |  2 +-
 .../core/browser/visitsegment_database.cc     |  4 +--
 .../media_device_salt_database.cc             |  2 +-
 .../core/background/request_queue_store.cc    |  4 +--
 .../browser/password_store/login_database.cc  | 11 +++----
 .../webdata/plus_address_table.cc             |  5 ++--
 .../storage/power_bookmark_database_impl.cc   | 30 +++++++++----------
 .../storage/power_bookmark_database_impl.h    |  2 +-
 .../power_bookmark_sync_metadata_database.cc  |  4 +--
 components/search_engines/keyword_table.cc    |  7 +++--
 .../database/ukm_database_test_utils.cc       |  8 +++--
 .../shared_storage_database_migrations.cc     |  4 +--
 .../database/first_party_sets_database.cc     | 16 +++++-----
 .../interest_group/interest_group_storage.cc  | 12 ++++----
 content/browser/media/cdm_storage_database.cc |  2 +-
 .../trace_report/trace_report_database.cc     |  2 +-
 ...lite_persistent_reporting_and_nel_store.cc | 22 +++++++++-----
 ...lite_persistent_shared_dictionary_store.cc |  2 +-
 sql/database.cc                               |  8 ++---
 sql/test/test_helpers.cc                      |  2 +-
 storage/browser/quota/quota_database.cc       | 16 +++++-----
 .../quota/quota_database_migrations.cc        | 11 ++++---
 39 files changed, 143 insertions(+), 134 deletions(-)

diff --git a/chrome/browser/ash/app_list/search/local_image_search/annotation_storage.cc b/chrome/browser/ash/app_list/search/local_image_search/annotation_storage.cc
index 990e9ba08da26..e7b513ffaf520 100644
--- a/chrome/browser/ash/app_list/search/local_image_search/annotation_storage.cc
+++ b/chrome/browser/ash/app_list/search/local_image_search/annotation_storage.cc
@@ -278,8 +278,8 @@ std::vector<ImageInfo> AnnotationStorage::GetAllAnnotationsForTest() {
   std::vector<ImageInfo> matched_paths;
   while (statement->Step()) {
     const std::string annotation = statement->ColumnString(0);
-    base::FilePath file_path(statement->ColumnString(1));
-    file_path = file_path.Append(statement->ColumnString(2));
+    base::FilePath file_path(statement->ColumnStringView(1));
+    file_path = file_path.Append(statement->ColumnStringView(2));
     const base::Time time = statement->ColumnTime(3);
     const int64_t file_size = statement->ColumnInt64(4);
     DVLOG(1) << "Select find: " << annotation << ", " << file_path << ", "
@@ -454,22 +454,22 @@ std::vector<FileSearchResult> AnnotationStorage::PrefixSearch(
   while (statement->Step()) {
     double relevance = FuzzyTokenizedStringMatch::TokenSetRatio(
         tokenized_query,
-        TokenizedString(base::UTF8ToUTF16(statement->ColumnString(0)),
+        TokenizedString(base::UTF8ToUTF16(statement->ColumnStringView(0)),
                         Mode::kWords),
         /*partial=*/false);
     if (relevance < GetRelevanceThreshold()) {
       continue;
     }
 
-    base::FilePath file_path(statement->ColumnString(1));
-    file_path = file_path.Append(statement->ColumnString(2));
+    base::FilePath file_path(statement->ColumnStringView(1));
+    file_path = file_path.Append(statement->ColumnStringView(2));
     const base::Time time = statement->ColumnTime(3);
     // Updates the relevance as a weighted average of the query-term relevance
     // and the image annotation relevance score.
     relevance = kRelevanceWeight * relevance +
                 (1 - kRelevanceWeight) * statement->ColumnDouble(4);
-    DVLOG(1) << "Select: " << statement->ColumnString(0) << ", " << file_path
-             << ", " << time << " rl: " << relevance;
+    DVLOG(1) << "Select: " << statement->ColumnStringView(0) << ", "
+             << file_path << ", " << time << " rl: " << relevance;
 
     if (matched_paths.empty() || matched_paths.back().file_path != file_path) {
       matched_paths.emplace_back(file_path, std::move(time), relevance);
diff --git a/chrome/browser/ash/app_list/search/local_image_search/documents_table.cc b/chrome/browser/ash/app_list/search/local_image_search/documents_table.cc
index 41097178ad310..8fa970c045217 100644
--- a/chrome/browser/ash/app_list/search/local_image_search/documents_table.cc
+++ b/chrome/browser/ash/app_list/search/local_image_search/documents_table.cc
@@ -162,8 +162,8 @@ bool DocumentsTable::GetAllFiles(SqlDatabase* db,
   }
 
   while (statement->Step()) {
-    base::FilePath file_path(statement->ColumnString(0));
-    file_path = file_path.Append(statement->ColumnString(1));
+    base::FilePath file_path(statement->ColumnStringView(0));
+    file_path = file_path.Append(statement->ColumnStringView(1));
 
     DVLOG(1) << "GetAll : " << file_path;
     documents.emplace_back(base::FilePath(std::move(file_path)));
@@ -192,8 +192,8 @@ bool DocumentsTable::SearchByDirectory(
   statement->BindString(0, base::StrCat({directory.value(), "%"}));
 
   while (statement->Step()) {
-    base::FilePath file_path(statement->ColumnString(0));
-    file_path = file_path.Append(statement->ColumnString(1));
+    base::FilePath file_path(statement->ColumnStringView(0));
+    file_path = file_path.Append(statement->ColumnStringView(1));
     matched_paths.emplace_back(file_path);
   }
 
diff --git a/chrome/browser/diagnostics/sqlite_diagnostics.cc b/chrome/browser/diagnostics/sqlite_diagnostics.cc
index 4379cec8a4fb1..d0eb38fbbdbe1 100644
--- a/chrome/browser/diagnostics/sqlite_diagnostics.cc
+++ b/chrome/browser/diagnostics/sqlite_diagnostics.cc
@@ -144,7 +144,7 @@ class SqliteIntegrityTest : public DiagnosticsTest {
       }
 
       while (statement.Step()) {
-        std::string result(statement.ColumnString(0));
+        std::string_view result = statement.ColumnStringView(0);
         if ("ok" != result)
           ++errors;
       }
diff --git a/chrome/browser/extensions/activity_log/counting_policy.cc b/chrome/browser/extensions/activity_log/counting_policy.cc
index 00afd577829be..c709cfaa25eaf 100644
--- a/chrome/browser/extensions/activity_log/counting_policy.cc
+++ b/chrome/browser/extensions/activity_log/counting_policy.cc
@@ -500,7 +500,7 @@ std::unique_ptr<Action::ActionVector> CountingPolicy::DoReadFilteredData(
 
     if (query.GetColumnType(4) != sql::ColumnType::kNull) {
       std::optional<base::Value> parsed_value =
-          base::JSONReader::Read(query.ColumnString(4));
+          base::JSONReader::Read(query.ColumnStringView(4));
       if (parsed_value && parsed_value->is_list()) {
         action->set_args(std::move(*parsed_value).TakeList());
       }
@@ -512,7 +512,7 @@ std::unique_ptr<Action::ActionVector> CountingPolicy::DoReadFilteredData(
 
     if (query.GetColumnType(8) != sql::ColumnType::kNull) {
       std::optional<base::Value> parsed_value =
-          base::JSONReader::Read(query.ColumnString(8));
+          base::JSONReader::Read(query.ColumnStringView(8));
       if (parsed_value && parsed_value->is_dict()) {
         action->set_other(std::move(*parsed_value).TakeDict());
       }
diff --git a/chrome/browser/extensions/activity_log/fullstream_ui_policy.cc b/chrome/browser/extensions/activity_log/fullstream_ui_policy.cc
index f75b79b17b5e2..02a0759310f4e 100644
--- a/chrome/browser/extensions/activity_log/fullstream_ui_policy.cc
+++ b/chrome/browser/extensions/activity_log/fullstream_ui_policy.cc
@@ -193,7 +193,7 @@ std::unique_ptr<Action::ActionVector> FullStreamUIPolicy::DoReadFilteredData(
 
     if (query.GetColumnType(4) != sql::ColumnType::kNull) {
       std::optional<base::Value> parsed_value =
-          base::JSONReader::Read(query.ColumnString(4));
+          base::JSONReader::Read(query.ColumnStringView(4));
       if (parsed_value && parsed_value->is_list()) {
         action->set_args(std::move(*parsed_value).TakeList());
       }
@@ -205,7 +205,7 @@ std::unique_ptr<Action::ActionVector> FullStreamUIPolicy::DoReadFilteredData(
 
     if (query.GetColumnType(8) != sql::ColumnType::kNull) {
       std::optional<base::Value> parsed_value =
-          base::JSONReader::Read(query.ColumnString(8));
+          base::JSONReader::Read(query.ColumnStringView(8));
       if (parsed_value && parsed_value->is_dict()) {
         action->set_other(std::move(*parsed_value).TakeDict());
       }
diff --git a/chrome/utility/importer/firefox_importer.cc b/chrome/utility/importer/firefox_importer.cc
index a56b4f3eeab49..477d3cae423dd 100644
--- a/chrome/utility/importer/firefox_importer.cc
+++ b/chrome/utility/importer/firefox_importer.cc
@@ -83,7 +83,7 @@ bool CanImportURL(const GURL& url) {
 
 // Initializes |favicon_url| and |png_data| members of given FaviconUsageData
 // structure with provided favicon data. Returns true if data is valid.
-bool SetFaviconData(const std::string& icon_url,
+bool SetFaviconData(std::string_view icon_url,
                     const std::vector<unsigned char>& icon_data,
                     favicon_base::FaviconUsageData* usage_data) {
   usage_data->favicon_url = GURL(icon_url);
@@ -583,8 +583,9 @@ void FirefoxImporter::LoadFavicons(
         continue;
 
       favicon_base::FaviconUsageData usage_data;
-      if (!SetFaviconData(s.ColumnString(0), data, &usage_data))
+      if (!SetFaviconData(s.ColumnStringView(0), data, &usage_data)) {
         continue;
+      }
 
       usage_data.urls = i.second;
       favicons->push_back(usage_data);
@@ -637,8 +638,9 @@ void FirefoxImporter::LoadFavicons(
         continue;
 
       favicon_base::FaviconUsageData usage_data;
-      if (!SetFaviconData(s.ColumnString(1), data, &usage_data))
+      if (!SetFaviconData(s.ColumnStringView(1), data, &usage_data)) {
         continue;
+      }
 
       usage_data.urls.insert(entry.url);
       favicons->push_back(usage_data);
diff --git a/components/affiliations/core/browser/sql_table_builder.cc b/components/affiliations/core/browser/sql_table_builder.cc
index 2bb0c3cd03a89..37afa986e291a 100644
--- a/components/affiliations/core/browser/sql_table_builder.cc
+++ b/components/affiliations/core/browser/sql_table_builder.cc
@@ -40,9 +40,9 @@ bool CheckForeignKeyConstraints(sql::Database& db) {
   bool ret = true;
   while (stmt.Step()) {
     ret = false;
-    LOG(ERROR) << "Foreign key violation "
-               << stmt.ColumnString(0) + ", " + stmt.ColumnString(1) + ", " +
-                      stmt.ColumnString(2) + ", " + stmt.ColumnString(3);
+    LOG(ERROR) << "Foreign key violation " << stmt.ColumnStringView(0) << ", "
+               << stmt.ColumnStringView(1) << ", " << stmt.ColumnStringView(2)
+               << ", " << stmt.ColumnStringView(3);
   }
   return ret;
 }
diff --git a/components/autofill/core/browser/webdata/addresses/address_autofill_table.cc b/components/autofill/core/browser/webdata/addresses/address_autofill_table.cc
index 6a751038f08fa..e438f2dcc8f2c 100644
--- a/components/autofill/core/browser/webdata/addresses/address_autofill_table.cc
+++ b/components/autofill/core/browser/webdata/addresses/address_autofill_table.cc
@@ -183,7 +183,7 @@ bool AddLegacyAutofillProfileNamesToProfile(sql::Database* db,
            kConjunctionLastNameStatus, kSecondLastName, kSecondLastNameStatus,
            kLastName, kLastNameStatus, kFullName, kFullNameStatus},
           profile->guid())) {
-    DCHECK_EQ(profile->guid(), s.ColumnString(0));
+    DCHECK_EQ(profile->guid(), s.ColumnStringView(0));
 
     int index = 1;
     for (FieldType type :
@@ -230,7 +230,7 @@ bool AddLegacyAutofillProfileAddressesToProfile(sql::Database* db,
                     kFloor,
                     kFloorStatus},
                    profile->guid())) {
-    DCHECK_EQ(profile->guid(), s.ColumnString(0));
+    DCHECK_EQ(profile->guid(), s.ColumnStringView(0));
     std::u16string street_address = s.ColumnString16(1);
     std::u16string dependent_locality = s.ColumnString16(13);
     std::u16string city = s.ColumnString16(15);
@@ -292,7 +292,7 @@ bool AddLegacyAutofillProfileEmailsToProfile(sql::Database* db,
   sql::Statement s;
   if (SelectByGuid(db, s, kAutofillProfileEmailsTable, {kGuid, kEmail},
                    profile->guid())) {
-    DCHECK_EQ(profile->guid(), s.ColumnString(0));
+    DCHECK_EQ(profile->guid(), s.ColumnStringView(0));
     profile->SetRawInfo(EMAIL_ADDRESS, s.ColumnString16(1));
   }
   return s.Succeeded();
@@ -309,7 +309,7 @@ bool AddLegacyAutofillProfilePhonesToProfile(sql::Database* db,
   sql::Statement s;
   if (SelectByGuid(db, s, kAutofillProfilePhonesTable, {kGuid, kNumber},
                    profile->guid())) {
-    DCHECK_EQ(profile->guid(), s.ColumnString(0));
+    DCHECK_EQ(profile->guid(), s.ColumnStringView(0));
     profile->SetRawInfo(PHONE_HOME_WHOLE_NUMBER, s.ColumnString16(1));
   }
   return s.Succeeded();
diff --git a/components/autofill/core/browser/webdata/autofill_ai/entity_table.cc b/components/autofill/core/browser/webdata/autofill_ai/entity_table.cc
index 378e77765255c..c62a0c6054986 100644
--- a/components/autofill/core/browser/webdata/autofill_ai/entity_table.cc
+++ b/components/autofill/core/browser/webdata/autofill_ai/entity_table.cc
@@ -310,7 +310,7 @@ bool EntityTable::RemoveEntityInstancesModifiedBetween(base::Time delete_begin,
   s.BindInt64(1, delete_end.ToTimeT());
   std::vector<base::Uuid> guids;
   while (s.Step()) {
-    base::Uuid guid = base::Uuid::ParseLowercase(s.ColumnString(0));
+    base::Uuid guid = base::Uuid::ParseLowercase(s.ColumnStringView(0));
     if (!guid.is_valid()) {
       continue;
     }
@@ -340,7 +340,7 @@ EntityTable::LoadAttributes() const {
                  attributes::kFieldType, attributes::kValueEncrypted,
                  attributes::kVerificationStatus});
   while (s.Step()) {
-    base::Uuid entity_guid = base::Uuid::ParseLowercase(s.ColumnString(0));
+    base::Uuid entity_guid = base::Uuid::ParseLowercase(s.ColumnStringView(0));
     std::string attribute_type_name = s.ColumnString(1);
     std::underlying_type_t<FieldType> underlying_field_type = s.ColumnInt(2);
     std::u16string decrypted_value;
@@ -377,7 +377,7 @@ std::vector<EntityInstance> EntityTable::GetEntityInstances() const {
                 {entities::kGuid, entities::kEntityType, entities::kNickname,
                  entities::kDateModified});
   while (s.Step()) {
-    base::Uuid guid = base::Uuid::ParseLowercase(s.ColumnString(0));
+    base::Uuid guid = base::Uuid::ParseLowercase(s.ColumnStringView(0));
     std::string type_name = s.ColumnString(1);
     std::string nickname = s.ColumnString(2);
     base::Time date_modified = base::Time::FromTimeT(s.ColumnInt64(3));
diff --git a/components/autofill/core/browser/webdata/autofill_sync_metadata_table.cc b/components/autofill/core/browser/webdata/autofill_sync_metadata_table.cc
index 8e45fc256cb55..a3354f4d288fe 100644
--- a/components/autofill/core/browser/webdata/autofill_sync_metadata_table.cc
+++ b/components/autofill/core/browser/webdata/autofill_sync_metadata_table.cc
@@ -184,7 +184,7 @@ bool AutofillSyncMetadataTable::GetAllSyncEntityMetadata(
 
   while (s.Step()) {
     std::string storage_key = s.ColumnString(0);
-    std::string serialized_metadata = s.ColumnString(1);
+    std::string_view serialized_metadata = s.ColumnStringView(1);
     auto entity_metadata = std::make_unique<sync_pb::EntityMetadata>();
     if (entity_metadata->ParseFromString(serialized_metadata)) {
       metadata_batch->AddMetadata(storage_key, std::move(entity_metadata));
@@ -212,7 +212,7 @@ bool AutofillSyncMetadataTable::GetDataTypeState(
     return true;
   }
 
-  std::string serialized_state = s.ColumnString(0);
+  std::string_view serialized_state = s.ColumnStringView(0);
   return state->ParseFromString(serialized_state);
 }
 
diff --git a/components/autofill/core/browser/webdata/payments/payments_autofill_table.cc b/components/autofill/core/browser/webdata/payments/payments_autofill_table.cc
index 8e98057bbf125..5303af9bbfcf9 100644
--- a/components/autofill/core/browser/webdata/payments/payments_autofill_table.cc
+++ b/components/autofill/core/browser/webdata/payments/payments_autofill_table.cc
@@ -1308,7 +1308,7 @@ bool PaymentsAutofillTable::GetServerIbans(std::vector<std::unique_ptr<Iban>>& i
   while (s.Step()) {
     int index = 0;
     int64_t instrument_id = 0;
-    if (!base::StringToInt64(s.ColumnString(index++), &instrument_id)) {
+    if (!base::StringToInt64(s.ColumnStringView(index++), &instrument_id)) {
       continue;
     }
     std::unique_ptr<Iban> iban =
diff --git a/components/history/core/browser/download_database.cc b/components/history/core/browser/download_database.cc
index 2b59f3f2a4ea8..1ed9e8229e9a6 100644
--- a/components/history/core/browser/download_database.cc
+++ b/components/history/core/browser/download_database.cc
@@ -52,7 +52,7 @@ void BindFilePath(sql::Statement& statement,
   statement.BindString(col, path.value());
 }
 base::FilePath ColumnFilePath(sql::Statement& statement, int col) {
-  return base::FilePath(statement.ColumnString(col));
+  return base::FilePath(statement.ColumnStringView(col));
 }
 
 #else
@@ -64,7 +64,7 @@ void BindFilePath(sql::Statement& statement,
   statement.BindString(col, path.AsUTF8Unsafe());
 }
 base::FilePath ColumnFilePath(sql::Statement& statement, int col) {
-  return base::FilePath::FromUTF8Unsafe(statement.ColumnString(col));
+  return base::FilePath::FromUTF8Unsafe(statement.ColumnStringView(col));
 }
 
 #endif
diff --git a/components/history/core/browser/history_database.cc b/components/history/core/browser/history_database.cc
index 9393e3783c87c..39d56ffe91515 100644
--- a/components/history/core/browser/history_database.cc
+++ b/components/history/core/browser/history_database.cc
@@ -278,7 +278,7 @@ void HistoryDatabase::ComputeDatabaseMetrics(
     std::set<std::string> month_hosts;
     base::Time one_week_ago = base::Time::Now() - base::Days(7);
     while (url_sql.Step()) {
-      GURL url(url_sql.ColumnString(0));
+      GURL url(url_sql.ColumnStringView(0));
       base::Time visit_time = url_sql.ColumnTime(1);
       ++month_url_count;
       month_hosts.insert(url.host());
@@ -311,7 +311,7 @@ int HistoryDatabase::CountUniqueHostsVisitedLastMonth() {
 
   std::set<std::string> hosts;
   while (url_sql.Step()) {
-    GURL url(url_sql.ColumnString(0));
+    GURL url(url_sql.ColumnStringView(0));
     hosts.insert(url.host());
   }
 
@@ -349,7 +349,7 @@ DomainsVisitedResult HistoryDatabase::GetUniqueDomainsVisited(
   std::set<std::string> locally_visited_domains_set;
 
   while (url_sql.Step()) {
-    GURL url(url_sql.ColumnString(0));
+    GURL url(url_sql.ColumnStringView(0));
     std::string domain = net::registry_controlled_domains::GetDomainAndRegistry(
         url, net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES);
 
@@ -364,7 +364,7 @@ DomainsVisitedResult HistoryDatabase::GetUniqueDomainsVisited(
       result.all_visited_domains.push_back(domain);
     }
 
-    bool is_local = url_sql.ColumnString(1).empty() &&
+    bool is_local = url_sql.ColumnStringView(1).empty() &&
                     url_sql.ColumnInt(2) == VisitSource::SOURCE_BROWSED;
 
     if (is_local && !locally_visited_domains_set.contains(domain)) {
diff --git a/components/history/core/browser/sync/history_sync_metadata_database.cc b/components/history/core/browser/sync/history_sync_metadata_database.cc
index da379a5aa4ef2..19ab07578f001 100644
--- a/components/history/core/browser/sync/history_sync_metadata_database.cc
+++ b/components/history/core/browser/sync/history_sync_metadata_database.cc
@@ -168,7 +168,7 @@ bool HistorySyncMetadataDatabase::GetAllEntityMetadata(
   while (s.Step()) {
     std::string storage_key =
         StorageKeyFromMicrosSinceWindowsEpoch(s.ColumnInt64(0));
-    std::string serialized_metadata = s.ColumnString(1);
+    std::string_view serialized_metadata = s.ColumnStringView(1);
     auto entity_metadata = std::make_unique<sync_pb::EntityMetadata>();
     if (!entity_metadata->ParseFromString(serialized_metadata)) {
       DLOG(WARNING) << "Failed to deserialize HISTORY data type "
diff --git a/components/history/core/browser/url_database.cc b/components/history/core/browser/url_database.cc
index 9b9fb72d8a4ac..cc7000522b3b8 100644
--- a/components/history/core/browser/url_database.cc
+++ b/components/history/core/browser/url_database.cc
@@ -55,7 +55,7 @@ URLDatabase::~URLDatabase() = default;
 bool URLDatabase::FillURLRow(sql::Statement& s, URLRow* i) {
   DCHECK(i);
 
-  GURL url(s.ColumnString(1));
+  GURL url(s.ColumnStringView(1));
   if (!url.is_valid()) {
     return false;
   }
@@ -214,7 +214,7 @@ bool URLDatabase::URLTableContainsAutoincrement() {
   if (!statement.Step())
     return false;
 
-  std::string urls_schema = statement.ColumnString(0);
+  std::string_view urls_schema = statement.ColumnStringView(0);
   // We check if the whole schema contains "AUTOINCREMENT", since
   // "AUTOINCREMENT" only can be used for "INTEGER PRIMARY KEY", so we assume no
   // other columns could contain "AUTOINCREMENT".
diff --git a/components/history/core/browser/visit_annotations_database.cc b/components/history/core/browser/visit_annotations_database.cc
index a4a2e35207b57..3a93a4214fbdd 100644
--- a/components/history/core/browser/visit_annotations_database.cc
+++ b/components/history/core/browser/visit_annotations_database.cc
@@ -482,14 +482,14 @@ bool VisitAnnotationsDatabase::GetContentAnnotationsForVisit(
   out_content_annotations->model_annotations.visibility_score =
       static_cast<float>(statement.ColumnDouble(1));
   out_content_annotations->model_annotations.categories =
-      GetCategoriesFromStringColumn(statement.ColumnString(2));
+      GetCategoriesFromStringColumn(statement.ColumnStringView(2));
   out_content_annotations->model_annotations.page_topics_model_version =
       statement.ColumnInt64(3);
   out_content_annotations->annotation_flags = statement.ColumnInt64(4);
   out_content_annotations->model_annotations.entities =
-      GetCategoriesFromStringColumn(statement.ColumnString(5));
+      GetCategoriesFromStringColumn(statement.ColumnStringView(5));
   out_content_annotations->related_searches =
-      DeserializeFromStringColumn(statement.ColumnString(6));
+      DeserializeFromStringColumn(statement.ColumnStringView(6));
   out_content_annotations->search_normalized_url =
       GURL(statement.ColumnStringView(7));
   out_content_annotations->search_terms = statement.ColumnString16(8);
@@ -1420,7 +1420,7 @@ bool VisitAnnotationsDatabase::ClustersTableContainsAutoincrement() {
     return false;
   }
 
-  std::string clusters_schema = statement.ColumnString(0);
+  std::string_view clusters_schema = statement.ColumnStringView(0);
   // We check if the whole schema contains "AUTOINCREMENT", since
   // "AUTOINCREMENT" only can be used for "INTEGER PRIMARY KEY", so we assume no
   // other columns could contain "AUTOINCREMENT".
@@ -1506,7 +1506,7 @@ std::string VisitAnnotationsDatabase::ConvertCategoriesToStringColumn(
 // functions should not be changed.
 std::vector<VisitContentModelAnnotations::Category>
 VisitAnnotationsDatabase::GetCategoriesFromStringColumn(
-    const std::string& column_value) {
+    std::string_view column_value) {
   std::vector<VisitContentModelAnnotations::Category> categories;
 
   std::vector<std::string> category_strings = base::SplitString(
@@ -1538,7 +1538,7 @@ std::string VisitAnnotationsDatabase::SerializeToStringColumn(
 // format is already being synced, the implementation of these functions
 // should not be changed.
 std::vector<std::string> VisitAnnotationsDatabase::DeserializeFromStringColumn(
-    const std::string& column_value) {
+    std::string_view column_value) {
   using std::string_literals::operator""s;
   return base::SplitString(column_value, "\0"s, base::TRIM_WHITESPACE,
                            base::SPLIT_WANT_NONEMPTY);
diff --git a/components/history/core/browser/visit_annotations_database.h b/components/history/core/browser/visit_annotations_database.h
index 3ad3f9acdc120..d43bbba5a68a7 100644
--- a/components/history/core/browser/visit_annotations_database.h
+++ b/components/history/core/browser/visit_annotations_database.h
@@ -5,6 +5,7 @@
 #ifndef COMPONENTS_HISTORY_CORE_BROWSER_VISIT_ANNOTATIONS_DATABASE_H_
 #define COMPONENTS_HISTORY_CORE_BROWSER_VISIT_ANNOTATIONS_DATABASE_H_
 
+#include <string_view>
 #include <vector>
 
 #include "base/time/time.h"
@@ -159,7 +160,7 @@ class VisitAnnotationsDatabase {
   // the serialized format is already being synced, the implementation of these
   // functions should not be changed.
   static std::vector<VisitContentModelAnnotations::Category>
-  GetCategoriesFromStringColumn(const std::string& column_value);
+  GetCategoriesFromStringColumn(std::string_view column_value);
 
   // Serializes a vector of strings into a string separated by null character
   // that can be stored in the db. As the serialized format is already being
@@ -171,7 +172,7 @@ class VisitAnnotationsDatabase {
   // of strings. As the serialized format is already being synced, the
   // implementation of these functions should not be changed.
   static std::vector<std::string> DeserializeFromStringColumn(
-      const std::string& column_value);
+      std::string_view column_value);
 
  protected:
   // Returns the database for the functions in this interface.
diff --git a/components/history/core/browser/visit_database.cc b/components/history/core/browser/visit_database.cc
index 14a4497edb1ab..dc158e98b6770 100644
--- a/components/history/core/browser/visit_database.cc
+++ b/components/history/core/browser/visit_database.cc
@@ -1387,7 +1387,7 @@ bool VisitDatabase::VisitTableContainsAutoincrement() {
   if (!statement.Step())
     return false;
 
-  std::string urls_schema = statement.ColumnString(0);
+  std::string_view urls_schema = statement.ColumnStringView(0);
   // We check if the whole schema contains "AUTOINCREMENT", since
   // "AUTOINCREMENT" only can be used for "INTEGER PRIMARY KEY", so we assume no
   // other columns could contain "AUTOINCREMENT".
diff --git a/components/history/core/browser/visitsegment_database.cc b/components/history/core/browser/visitsegment_database.cc
index 280cb06c99991..10d6b81051b59 100644
--- a/components/history/core/browser/visitsegment_database.cc
+++ b/components/history/core/browser/visitsegment_database.cc
@@ -312,7 +312,7 @@ VisitSegmentDatabase::QuerySegmentUsage(
   for (std::unique_ptr<PageUsageData>& pud : segments) {
     statement2.BindInt64(0, pud->GetID());
     if (statement2.Step()) {
-      GURL url(statement2.ColumnString(0));
+      GURL url(statement2.ColumnStringView(0));
       if (url_filter.is_null() || url_filter.Run(url)) {
         pud->SetURL(url);
         pud->SetTitle(statement2.ColumnString16(1));
@@ -375,7 +375,7 @@ bool VisitSegmentDatabase::MigrateVisitSegmentNames() {
   bool success = true;
   while (select.Step()) {
     SegmentID id = select.ColumnInt64(0);
-    std::string old_name = select.ColumnString(1);
+    std::string_view old_name = select.ColumnStringView(1);
     std::string new_name = ComputeSegmentName(GURL(old_name));
     if (new_name.empty() || old_name == new_name)
       continue;
diff --git a/components/media_device_salt/media_device_salt_database.cc b/components/media_device_salt/media_device_salt_database.cc
index 41091359ebe04..bd0637004bf0d 100644
--- a/components/media_device_salt/media_device_salt_database.cc
+++ b/components/media_device_salt/media_device_salt_database.cc
@@ -168,7 +168,7 @@ std::vector<blink::StorageKey> MediaDeviceSaltDatabase::GetAllStorageKeys() {
   sql::Statement statement(db_.GetUniqueStatement(kGetStorageKeysSql));
   while (statement.Step()) {
     std::optional<blink::StorageKey> key =
-        blink::StorageKey::Deserialize(statement.ColumnString(0));
+        blink::StorageKey::Deserialize(statement.ColumnStringView(0));
     if (key.has_value()) {
       storage_keys.push_back(*key);
     }
diff --git a/components/offline_pages/core/background/request_queue_store.cc b/components/offline_pages/core/background/request_queue_store.cc
index ab86bf916c17e..2fe17b4a6e498 100644
--- a/components/offline_pages/core/background/request_queue_store.cc
+++ b/components/offline_pages/core/background/request_queue_store.cc
@@ -222,9 +222,9 @@ std::unique_ptr<SavePageRequest> MakeSavePageRequest(
   const int64_t completed_attempt_count = statement.ColumnInt64(5);
   const SavePageRequest::RequestState state =
       ToRequestState(statement.ColumnInt64(6));
-  const GURL url(statement.ColumnString(7));
+  const GURL url(statement.ColumnStringView(7));
   ClientId client_id(statement.ColumnString(8), statement.ColumnString(9));
-  GURL original_url(statement.ColumnString(10));
+  GURL original_url(statement.ColumnStringView(10));
   std::string request_origin(statement.ColumnString(11));
 
   DVLOG(2) << "making save page request - id " << id << " url " << url
diff --git a/components/password_manager/core/browser/password_store/login_database.cc b/components/password_manager/core/browser/password_store/login_database.cc
index d84db886352e7..e93808065e979 100644
--- a/components/password_manager/core/browser/password_store/login_database.cc
+++ b/components/password_manager/core/browser/password_store/login_database.cc
@@ -1729,17 +1729,14 @@ PasswordForm LoginDatabase::GetFormWithoutPasswordFromStatement(
     sql::Statement& s) const {
   PasswordForm form;
   form.primary_key = FormPrimaryKey(s.ColumnInt(COLUMN_ID));
-  std::string tmp = s.ColumnString(COLUMN_ORIGIN_URL);
-  form.url = GURL(tmp);
-  tmp = s.ColumnString(COLUMN_ACTION_URL);
-  form.action = GURL(tmp);
+  form.url = GURL(s.ColumnStringView(COLUMN_ORIGIN_URL));
+  form.action = GURL(s.ColumnStringView(COLUMN_ACTION_URL));
   form.username_element = s.ColumnString16(COLUMN_USERNAME_ELEMENT);
   form.username_value = s.ColumnString16(COLUMN_USERNAME_VALUE);
   form.password_element = s.ColumnString16(COLUMN_PASSWORD_ELEMENT);
   s.ColumnBlobAsString(COLUMN_KEYCHAIN_IDENTIFIER, &form.keychain_identifier);
   form.submit_element = s.ColumnString16(COLUMN_SUBMIT_ELEMENT);
-  tmp = s.ColumnString(COLUMN_SIGNON_REALM);
-  form.signon_realm = tmp;
+  form.signon_realm = s.ColumnString(COLUMN_SIGNON_REALM);
   form.date_created = s.ColumnTime(COLUMN_DATE_CREATED);
   form.blocked_by_user = (s.ColumnInt(COLUMN_BLOCKLISTED_BY_USER) > 0);
   // TODO(crbug.com/40732888): Add metrics to capture how often these values
@@ -2116,7 +2113,7 @@ LoginDatabase::SyncMetadataStore::GetDataTypeState(syncer::DataType data_type) {
     }
   }
 
-  std::string serialized_state = s.ColumnString(0);
+  std::string_view serialized_state = s.ColumnStringView(0);
   if (state->ParseFromString(serialized_state)) {
     return state;
   }
diff --git a/components/plus_addresses/webdata/plus_address_table.cc b/components/plus_addresses/webdata/plus_address_table.cc
index 121b360bb0868..3700126333c58 100644
--- a/components/plus_addresses/webdata/plus_address_table.cc
+++ b/components/plus_addresses/webdata/plus_address_table.cc
@@ -71,7 +71,8 @@ bool GetDataTypeState(sql::Database& db,
   // persisted yet and `Step()` will fail. Don't treat this as an error, but
   // fallback to the default state instead.
   if (data_type_state_query.Step() &&
-      !data_type_state.ParseFromString(data_type_state_query.ColumnString(0))) {
+      !data_type_state.ParseFromString(
+          data_type_state_query.ColumnStringView(0))) {
     return false;
   }
   metadata_batch.SetDataTypeState(data_type_state);
@@ -89,7 +90,7 @@ bool AddEntityMetadata(sql::Database& db,
   entity_query.BindInt(0, syncer::DataTypeToStableIdentifier(data_type));
   while (entity_query.Step()) {
     auto entity_metadata = std::make_unique<sync_pb::EntityMetadata>();
-    if (!entity_metadata->ParseFromString(entity_query.ColumnString(1))) {
+    if (!entity_metadata->ParseFromString(entity_query.ColumnStringView(1))) {
       return false;
     }
     metadata_batch.AddMetadata(entity_query.ColumnString(0),
diff --git a/components/power_bookmarks/storage/power_bookmark_database_impl.cc b/components/power_bookmarks/storage/power_bookmark_database_impl.cc
index a3ea27ac72840..1aaf216d299f1 100644
--- a/components/power_bookmarks/storage/power_bookmark_database_impl.cc
+++ b/components/power_bookmarks/storage/power_bookmark_database_impl.cc
@@ -344,8 +344,8 @@ std::vector<std::unique_ptr<Power>> PowerBookmarkDatabaseImpl::GetPowersForURL(
 
     std::optional<sync_pb::PowerBookmarkSpecifics> specifics =
         DeserializeOrDelete(
-            statement.ColumnString(1),
-            base::Uuid::ParseLowercase(statement.ColumnString(0)));
+            statement.ColumnStringView(1),
+            base::Uuid::ParseLowercase(statement.ColumnStringView(0)));
     if (!specifics.has_value())
       continue;
 
@@ -381,8 +381,8 @@ PowerBookmarkDatabaseImpl::GetPowerOverviewsForType(
 
     std::optional<sync_pb::PowerBookmarkSpecifics> specifics =
         DeserializeOrDelete(
-            statement.ColumnString(1),
-            base::Uuid::ParseLowercase(statement.ColumnString(0)));
+            statement.ColumnStringView(1),
+            base::Uuid::ParseLowercase(statement.ColumnStringView(0)));
     if (!specifics.has_value())
       continue;
 
@@ -416,8 +416,8 @@ PowerBookmarkDatabaseImpl::GetPowersForSearchParams(
 
     std::optional<sync_pb::PowerBookmarkSpecifics> specifics =
         DeserializeOrDelete(
-            statement.ColumnString(1),
-            base::Uuid::ParseLowercase(statement.ColumnString(0)));
+            statement.ColumnStringView(1),
+            base::Uuid::ParseLowercase(statement.ColumnStringView(0)));
     if (!specifics.has_value())
       continue;
     if (!MatchesSearchParams(specifics.value(), search_params))
@@ -486,8 +486,8 @@ PowerBookmarkDatabaseImpl::GetPowerOverviewsForSearchParams(
 
     std::optional<sync_pb::PowerBookmarkSpecifics> specifics =
         DeserializeOrDelete(
-            statement.ColumnString(1),
-            base::Uuid::ParseLowercase(statement.ColumnString(0)));
+            statement.ColumnStringView(1),
+            base::Uuid::ParseLowercase(statement.ColumnStringView(0)));
     if (!specifics.has_value()) {
       continue;
     }
@@ -620,8 +620,8 @@ PowerBookmarkDatabaseImpl::GetPowersForGUIDs(
 
     std::optional<sync_pb::PowerBookmarkSpecifics> specifics =
         DeserializeOrDelete(
-            statement.ColumnString(1),
-            base::Uuid::ParseLowercase(statement.ColumnString(0)));
+            statement.ColumnStringView(1),
+            base::Uuid::ParseLowercase(statement.ColumnStringView(0)));
     if (!specifics.has_value())
       continue;
 
@@ -649,8 +649,8 @@ std::vector<std::unique_ptr<Power>> PowerBookmarkDatabaseImpl::GetAllPowers() {
 
     std::optional<sync_pb::PowerBookmarkSpecifics> specifics =
         DeserializeOrDelete(
-            statement.ColumnString(1),
-            base::Uuid::ParseLowercase(statement.ColumnString(0)));
+            statement.ColumnStringView(1),
+            base::Uuid::ParseLowercase(statement.ColumnStringView(0)));
     if (!specifics.has_value())
       continue;
 
@@ -682,8 +682,8 @@ std::unique_ptr<Power> PowerBookmarkDatabaseImpl::GetPowerForGUID(
 
     std::optional<sync_pb::PowerBookmarkSpecifics> specifics =
         DeserializeOrDelete(
-            statement.ColumnString(1),
-            base::Uuid::ParseLowercase(statement.ColumnString(0)));
+            statement.ColumnStringView(1),
+            base::Uuid::ParseLowercase(statement.ColumnStringView(0)));
     if (!specifics.has_value())
       continue;
 
@@ -716,7 +716,7 @@ PowerBookmarkDatabaseImpl::GetSyncMetadataDatabase() {
 }
 
 std::optional<sync_pb::PowerBookmarkSpecifics>
-PowerBookmarkDatabaseImpl::DeserializeOrDelete(const std::string& data,
+PowerBookmarkDatabaseImpl::DeserializeOrDelete(std::string_view data,
                                                const base::Uuid& id) {
   sync_pb::PowerBookmarkSpecifics specifics;
   bool parse_success = specifics.ParseFromString(data);
diff --git a/components/power_bookmarks/storage/power_bookmark_database_impl.h b/components/power_bookmarks/storage/power_bookmark_database_impl.h
index 324721b3106a2..e17f9c710bbc9 100644
--- a/components/power_bookmarks/storage/power_bookmark_database_impl.h
+++ b/components/power_bookmarks/storage/power_bookmark_database_impl.h
@@ -72,7 +72,7 @@ class PowerBookmarkDatabaseImpl : public PowerBookmarkDatabase {
   bool CreateSchema();
 
   std::optional<sync_pb::PowerBookmarkSpecifics> DeserializeOrDelete(
-      const std::string& data,
+      std::string_view data,
       const base::Uuid& id);
 
   std::vector<std::string> GetGUIDsForURL(
diff --git a/components/power_bookmarks/storage/power_bookmark_sync_metadata_database.cc b/components/power_bookmarks/storage/power_bookmark_sync_metadata_database.cc
index 9364187ce628c..9b66e32778473 100644
--- a/components/power_bookmarks/storage/power_bookmark_sync_metadata_database.cc
+++ b/components/power_bookmarks/storage/power_bookmark_sync_metadata_database.cc
@@ -134,7 +134,7 @@ bool PowerBookmarkSyncMetadataDatabase::GetAllSyncEntityMetadata(
 
   while (s.Step()) {
     std::string storage_key = s.ColumnString(0);
-    std::string serialized_metadata = s.ColumnString(1);
+    std::string_view serialized_metadata = s.ColumnStringView(1);
     auto entity_metadata = std::make_unique<sync_pb::EntityMetadata>();
     if (!entity_metadata->ParseFromString(serialized_metadata)) {
       DLOG(WARNING) << "Failed to deserialize POWER_BOOKMARK data type "
@@ -161,4 +161,4 @@ bool PowerBookmarkSyncMetadataDatabase::GetDataTypeState(
   return false;
 }
 
-}  // namespace power_bookmarks
\ No newline at end of file
+}  // namespace power_bookmarks
diff --git a/components/search_engines/keyword_table.cc b/components/search_engines/keyword_table.cc
index 5cdd8e3f1a9bd..dc1feacec8561 100644
--- a/components/search_engines/keyword_table.cc
+++ b/components/search_engines/keyword_table.cc
@@ -582,7 +582,7 @@ std::optional<TemplateURLData> KeywordTable::GetKeywordDataFromStatement(
   // reading these out.  (GetKeywords() will delete these entries on return.)
   // NOTE: This code should only be needed as long as we might be reading such
   // potentially-old data and can be removed afterward.
-  if (s.ColumnString(4).empty()) {
+  if (s.ColumnStringView(4).empty()) {
     return std::nullopt;
   }
   data.SetURL(s.ColumnString(4));
@@ -596,7 +596,7 @@ std::optional<TemplateURLData> KeywordTable::GetKeywordDataFromStatement(
   data.originating_url = GURL(s.ColumnStringView(6));
   data.safe_for_autoreplace = s.ColumnBool(5);
   data.input_encodings = base::SplitString(
-      s.ColumnString(9), ";", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
+      s.ColumnStringView(9), ";", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
   data.id = s.ColumnInt64(0);
   data.date_created = s.ColumnTime(7);
   data.last_modified = s.ColumnTime(13);
@@ -614,7 +614,8 @@ std::optional<TemplateURLData> KeywordTable::GetKeywordDataFromStatement(
   data.enforced_by_policy = s.ColumnBool(25);
   data.featured_by_policy = s.ColumnBool(26);
 
-  std::optional<base::Value> value(base::JSONReader::Read(s.ColumnString(15)));
+  std::optional<base::Value> value(
+      base::JSONReader::Read(s.ColumnStringView(15)));
   if (value && value->is_list()) {
     for (const base::Value& alternate_url : value->GetList()) {
       if (alternate_url.is_string()) {
diff --git a/components/segmentation_platform/internal/database/ukm_database_test_utils.cc b/components/segmentation_platform/internal/database/ukm_database_test_utils.cc
index 8d47d74599f57..1ea49a35799bf 100644
--- a/components/segmentation_platform/internal/database/ukm_database_test_utils.cc
+++ b/components/segmentation_platform/internal/database/ukm_database_test_utils.cc
@@ -28,11 +28,13 @@ UkmMetricsTable::MetricsRow GetMetricsRowWithQuery(sql::Statement& statement) {
   row.url_id = UrlId::FromUnsafeValue(statement.ColumnInt64(3));
   row.event_id = MetricsRowEventId::FromUnsafeValue(statement.ColumnInt64(4));
   uint64_t event_hash = 0;
-  if (base::HexStringToUInt64(statement.ColumnString(5), &event_hash))
+  if (base::HexStringToUInt64(statement.ColumnStringView(5), &event_hash)) {
     row.event_hash = UkmEventHash::FromUnsafeValue(event_hash);
+  }
   uint64_t metric_hash = 0;
-  if (base::HexStringToUInt64(statement.ColumnString(6), &metric_hash))
+  if (base::HexStringToUInt64(statement.ColumnStringView(6), &metric_hash)) {
     row.metric_hash = UkmMetricHash::FromUnsafeValue(metric_hash);
+  }
   row.metric_value = statement.ColumnInt64(7);
   return row;
 }
@@ -45,7 +47,7 @@ UmaMetricEntry GetUmaMetricsRowWithQuery(sql::Statement& statement) {
   row.time = statement.ColumnTime(1);
   row.type = static_cast<proto::SignalType>(statement.ColumnInt64(3));
   uint64_t metric_hash = 0;
-  if (base::HexStringToUInt64(statement.ColumnString(4), &metric_hash)) {
+  if (base::HexStringToUInt64(statement.ColumnStringView(4), &metric_hash)) {
     row.name_hash = metric_hash;
   }
   row.value = statement.ColumnInt64(5);
diff --git a/components/services/storage/shared_storage/shared_storage_database_migrations.cc b/components/services/storage/shared_storage/shared_storage_database_migrations.cc
index 21e8e4f7bb894..87cb0abab8f9f 100644
--- a/components/services/storage/shared_storage/shared_storage_database_migrations.cc
+++ b/components/services/storage/shared_storage/shared_storage_database_migrations.cc
@@ -175,7 +175,7 @@ bool MigrateToVersion4(sql::Database& db, sql::MetaTable& meta_table) {
 
   while (select_statement.Step()) {
     net::SchemefulSite context_site =
-        net::SchemefulSite::Deserialize(select_statement.ColumnString(1));
+        net::SchemefulSite::Deserialize(select_statement.ColumnStringView(1));
     if (context_site.opaque() ||
         context_site.GetURL().scheme() == url::kFileScheme) {
       continue;
@@ -250,7 +250,7 @@ bool MigrateToVersion3(sql::Database& db, sql::MetaTable& meta_table) {
   while (select_statement.Step()) {
     sql::Statement insert_statement(
         db.GetCachedStatement(SQL_FROM_HERE, kInsertIntoNewValuesSql));
-    insert_statement.BindString(0, select_statement.ColumnString(0));
+    insert_statement.BindString(0, select_statement.ColumnStringView(0));
     insert_statement.BindBlob(1, select_statement.ColumnString16(1));
     insert_statement.BindBlob(2, select_statement.ColumnString16(2));
     insert_statement.BindTime(3, select_statement.ColumnTime(3));
diff --git a/content/browser/first_party_sets/database/first_party_sets_database.cc b/content/browser/first_party_sets/database/first_party_sets_database.cc
index 22754ee7aa1b9..7f9b74f86bc7f 100644
--- a/content/browser/first_party_sets/database/first_party_sets_database.cc
+++ b/content/browser/first_party_sets/database/first_party_sets_database.cc
@@ -434,11 +434,11 @@ std::optional<net::GlobalFirstPartySets> FirstPartySetsDatabase::GetGlobalSets(
     while (statement.Step()) {
       std::optional<net::SchemefulSite> site =
           FirstPartySetParser::CanonicalizeRegisteredDomain(
-              statement.ColumnString(0), /*emit_errors=*/false);
+              statement.ColumnStringView(0), /*emit_errors=*/false);
 
       std::optional<net::SchemefulSite> primary =
           FirstPartySetParser::CanonicalizeRegisteredDomain(
-              statement.ColumnString(1), /*emit_errors=*/false);
+              statement.ColumnStringView(1), /*emit_errors=*/false);
 
       std::optional<net::SiteType> site_type =
           net::FirstPartySetEntry::DeserializeSiteType(statement.ColumnInt(2));
@@ -558,7 +558,7 @@ FirstPartySetsDatabase::FetchSitesToClear(
   while (statement.Step()) {
     std::optional<net::SchemefulSite> site =
         FirstPartySetParser::CanonicalizeRegisteredDomain(
-            statement.ColumnString(0), /*emit_errors=*/false);
+            statement.ColumnStringView(0), /*emit_errors=*/false);
     // TODO(crbug.com/40221249): Invalid sites should be rare case but possible.
     // Consider deleting them from DB.
     if (site.has_value()) {
@@ -593,7 +593,7 @@ FirstPartySetsDatabase::FetchAllSitesToClearFilter(
   while (statement.Step()) {
     std::optional<net::SchemefulSite> site =
         FirstPartySetParser::CanonicalizeRegisteredDomain(
-            statement.ColumnString(0), /*emit_errors=*/false);
+            statement.ColumnStringView(0), /*emit_errors=*/false);
     // TODO(crbug.com/40221249): Invalid sites should be rare case but possible.
     // Consider deleting them from DB.
     if (site.has_value()) {
@@ -629,10 +629,10 @@ FirstPartySetsDatabase::FetchPolicyConfigurations(
   while (statement.Step()) {
     std::optional<net::SchemefulSite> site =
         FirstPartySetParser::CanonicalizeRegisteredDomain(
-            statement.ColumnString(0), /*emit_errors=*/false);
+            statement.ColumnStringView(0), /*emit_errors=*/false);
 
     std::optional<net::SchemefulSite> maybe_primary_site;
-    if (std::string primary_site = statement.ColumnString(1);
+    if (std::string_view primary_site = statement.ColumnStringView(1);
         !primary_site.empty()) {
       maybe_primary_site = FirstPartySetParser::CanonicalizeRegisteredDomain(
           primary_site, /*emit_errors=*/false);
@@ -703,13 +703,13 @@ FirstPartySetsDatabase::FetchManualConfiguration(
   while (statement.Step()) {
     std::optional<net::SchemefulSite> site =
         FirstPartySetParser::CanonicalizeRegisteredDomain(
-            statement.ColumnString(0), /*emit_errors=*/false);
+            statement.ColumnStringView(0), /*emit_errors=*/false);
 
     std::optional<net::SchemefulSite> maybe_primary_site;
     std::optional<net::SiteType> maybe_site_type;
     // DB entry for "deleted"  site will have null `primary_site` and
     // `site_type`.
-    if (std::string primary_site = statement.ColumnString(1);
+    if (std::string_view primary_site = statement.ColumnStringView(1);
         !primary_site.empty()) {
       maybe_primary_site = FirstPartySetParser::CanonicalizeRegisteredDomain(
           primary_site, /*emit_errors=*/false);
diff --git a/content/browser/interest_group/interest_group_storage.cc b/content/browser/interest_group/interest_group_storage.cc
index 23305bbb82a9a..7c3da5633a2c7 100644
--- a/content/browser/interest_group/interest_group_storage.cc
+++ b/content/browser/interest_group/interest_group_storage.cc
@@ -4588,13 +4588,13 @@ DoGetViewClickCountsForProviderAndEligible(sql::Database& db,
     return std::nullopt;
   }
   if (!result.uncompacted_view_events.ParseFromString(
-          get_counts.ColumnString(0)) ||
+          get_counts.ColumnStringView(0)) ||
       !result.compacted_view_events.ParseFromString(
-          get_counts.ColumnString(1)) ||
+          get_counts.ColumnStringView(1)) ||
       !result.uncompacted_click_events.ParseFromString(
-          get_counts.ColumnString(2)) ||
+          get_counts.ColumnStringView(2)) ||
       !result.compacted_click_events.ParseFromString(
-          get_counts.ColumnString(3))) {
+          get_counts.ColumnStringView(3))) {
     base::UmaHistogramEnumeration(
         "Storage.InterestGroup.ProtoDeserializationResult.ListOfTimestamps",
         InterestGroupStorageProtoSerializationResult::kFailed);
@@ -4740,9 +4740,9 @@ void DoRecordViewClick(sql::Database& db,
     if (get_counts.Step()) {
       row_exists = true;
       if (!uncompacted_view_events.ParseFromString(
-              get_counts.ColumnString(0)) ||
+              get_counts.ColumnStringView(0)) ||
           !uncompacted_click_events.ParseFromString(
-              get_counts.ColumnString(1))) {
+              get_counts.ColumnStringView(1))) {
         // TODO(crbug.com/355010821): Consider bubbling out the failure.
         base::UmaHistogramEnumeration(
             "Storage.InterestGroup.ProtoDeserializationResult.ListOfTimestamps",
diff --git a/content/browser/media/cdm_storage_database.cc b/content/browser/media/cdm_storage_database.cc
index a46cbe7dd534d..70da4fd0d24c3 100644
--- a/content/browser/media/cdm_storage_database.cc
+++ b/content/browser/media/cdm_storage_database.cc
@@ -287,7 +287,7 @@ CdmStorageKeyUsageSize CdmStorageDatabase::GetUsagePerAllStorageKeys(
   while (get_all_storage_keys_statement.Step()) {
     std::optional<blink::StorageKey> maybe_storage_key =
         blink::StorageKey::Deserialize(
-            get_all_storage_keys_statement.ColumnString(0));
+            get_all_storage_keys_statement.ColumnStringView(0));
     if (maybe_storage_key) {
       auto storage_key = maybe_storage_key.value();
       usage_per_storage_keys.emplace_back(
diff --git a/content/browser/tracing/trace_report/trace_report_database.cc b/content/browser/tracing/trace_report/trace_report_database.cc
index c7162314aca85..0aec54091709e 100644
--- a/content/browser/tracing/trace_report/trace_report_database.cc
+++ b/content/browser/tracing/trace_report/trace_report_database.cc
@@ -26,7 +26,7 @@ const char kLocalTracesTableName[] = "local_traces";
 constexpr int kCurrentVersionNumber = 5;
 
 ClientTraceReport GetReportFromStatement(sql::Statement& statement) {
-  auto trace_id = base::Token::FromString(statement.ColumnString(0));
+  auto trace_id = base::Token::FromString(statement.ColumnStringView(0));
   CHECK(trace_id.has_value());
 
   ClientTraceReport client_report;
diff --git a/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc b/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc
index 9e56279ca6774..306daeb47c037 100644
--- a/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc
+++ b/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc
@@ -78,7 +78,7 @@ base::TaskPriority GetReportingAndNelStoreBackgroundSequencePriority() {
 // Attempts to convert a string returned by NetworkAnonymizationKeyToString() to
 // a NetworkAnonymizationKey. Returns false on failure.
 [[nodiscard]] bool NetworkAnonymizationKeyFromString(
-    const std::string& string,
+    std::string_view string,
     NetworkAnonymizationKey* out_network_anonymization_key) {
   std::optional<base::Value> value = base::JSONReader::Read(string);
   if (!value)
@@ -1301,9 +1301,10 @@ void SQLitePersistentReportingAndNelStore::Backend::
     // Attempt to reconstitute a NEL policy from the fields stored in the
     // database.
     NetworkAnonymizationKey network_anonymization_key;
-    if (!NetworkAnonymizationKeyFromString(smt.ColumnString(0),
-                                           &network_anonymization_key))
+    if (!NetworkAnonymizationKeyFromString(smt.ColumnStringView(0),
+                                           &network_anonymization_key)) {
       continue;
+    }
     NetworkErrorLoggingService::NelPolicy policy;
     policy.key = NetworkErrorLoggingService::NelPolicyKey(
         network_anonymization_key,
@@ -1311,8 +1312,10 @@ void SQLitePersistentReportingAndNelStore::Backend::
             /* origin_scheme = */ smt.ColumnString(1),
             /* origin_host = */ smt.ColumnString(2),
             /* origin_port = */ smt.ColumnInt(3)));
-    if (!policy.received_ip_address.AssignFromIPLiteral(smt.ColumnString(4)))
+    if (!policy.received_ip_address.AssignFromIPLiteral(
+            smt.ColumnStringView(4))) {
       policy.received_ip_address = IPAddress();
+    }
     policy.report_to = smt.ColumnString(5);
     policy.expires = base::Time::FromDeltaSinceWindowsEpoch(
         base::Microseconds(smt.ColumnInt64(6)));
@@ -1388,9 +1391,11 @@ void SQLitePersistentReportingAndNelStore::Backend::
     // Attempt to reconstitute a ReportingEndpoint from the fields stored in the
     // database.
     NetworkAnonymizationKey network_anonymization_key;
-    if (!NetworkAnonymizationKeyFromString(endpoints_statement.ColumnString(0),
-                                           &network_anonymization_key))
+    if (!NetworkAnonymizationKeyFromString(
+            endpoints_statement.ColumnStringView(0),
+            &network_anonymization_key)) {
       continue;
+    }
     // The target_type is set to kDeveloper because this function is used for
     // V0 reporting, which only includes web developer entities.
     ReportingEndpointGroupKey group_key(
@@ -1416,9 +1421,10 @@ void SQLitePersistentReportingAndNelStore::Backend::
     // stored in the database.
     NetworkAnonymizationKey network_anonymization_key;
     if (!NetworkAnonymizationKeyFromString(
-            endpoint_groups_statement.ColumnString(0),
-            &network_anonymization_key))
+            endpoint_groups_statement.ColumnStringView(0),
+            &network_anonymization_key)) {
       continue;
+    }
     // The target_type is set to kDeveloper because this function is used for
     // V0 reporting, which only includes web developer entities.
     ReportingEndpointGroupKey group_key(
diff --git a/net/extras/sqlite/sqlite_persistent_shared_dictionary_store.cc b/net/extras/sqlite/sqlite_persistent_shared_dictionary_store.cc
index c156af1e0f001..b0863dbedaf5b 100644
--- a/net/extras/sqlite/sqlite_persistent_shared_dictionary_store.cc
+++ b/net/extras/sqlite/sqlite_persistent_shared_dictionary_store.cc
@@ -1006,7 +1006,7 @@ SQLitePersistentSharedDictionaryStore::Backend::GetOriginsBetweenImpl(
 
   std::set<url::Origin> origins;
   while (statement.Step()) {
-    const std::string frame_origin_string = statement.ColumnString(0);
+    const std::string_view frame_origin_string = statement.ColumnStringView(0);
     origins.insert(url::Origin::Create(GURL(frame_origin_string)));
   }
   return base::ok(std::vector<url::Origin>(origins.begin(), origins.end()));
diff --git a/sql/database.cc b/sql/database.cc
index 380830a51bbe3..ffafcdab79d9c 100644
--- a/sql/database.cc
+++ b/sql/database.cc
@@ -1718,13 +1718,13 @@ std::string Database::GetSchema() {
 
   std::string schema;
   while (statement.Step()) {
-    schema += statement.ColumnString(0);
+    schema += statement.ColumnStringView(0);
     schema += '|';
-    schema += statement.ColumnString(1);
+    schema += statement.ColumnStringView(1);
     schema += '|';
-    schema += statement.ColumnString(2);
+    schema += statement.ColumnStringView(2);
     schema += '|';
-    schema += statement.ColumnString(3);
+    schema += statement.ColumnStringView(3);
     schema += '\n';
   }
 
diff --git a/sql/test/test_helpers.cc b/sql/test/test_helpers.cc
index 391d9b80ec8c7..4905e2cd7cfcf 100644
--- a/sql/test/test_helpers.cc
+++ b/sql/test/test_helpers.cc
@@ -322,7 +322,7 @@ std::string ExecuteWithResults(Database* db,
     for (int i = 0; i < s.ColumnCount(); ++i) {
       if (i > 0)
         ret += column_sep;
-      ret += s.ColumnString(i);
+      ret += s.ColumnStringView(i);
     }
   }
   return ret;
diff --git a/storage/browser/quota/quota_database.cc b/storage/browser/quota/quota_database.cc
index c8acdafba179e..0c44d476cafbe 100644
--- a/storage/browser/quota/quota_database.cc
+++ b/storage/browser/quota/quota_database.cc
@@ -135,7 +135,7 @@ QuotaErrorOr<BucketInfo> BucketInfoFromSqlStatement(sql::Statement& statement) {
   }
 
   std::optional<StorageKey> storage_key =
-      StorageKey::Deserialize(statement.ColumnString(1));
+      StorageKey::Deserialize(statement.ColumnStringView(1));
   if (!storage_key.has_value()) {
     return base::unexpected(QuotaError::kStorageKeyError);
   }
@@ -621,7 +621,7 @@ QuotaErrorOr<mojom::BucketTableEntryPtr> QuotaDatabase::GetBucketInfoForTest(
   }
 
   std::optional<StorageKey> storage_key =
-      StorageKey::Deserialize(statement.ColumnString(1));
+      StorageKey::Deserialize(statement.ColumnStringView(1));
   if (!storage_key.has_value()) {
     return base::unexpected(QuotaError::kStorageKeyError);
   }
@@ -707,7 +707,7 @@ QuotaErrorOr<std::set<BucketLocator>> QuotaDatabase::GetBucketsForEviction(
 
   while (statement.Step()) {
     std::optional<StorageKey> read_storage_key =
-        StorageKey::Deserialize(statement.ColumnString(1));
+        StorageKey::Deserialize(statement.ColumnStringView(1));
     if (!read_storage_key.has_value()) {
       // TODO(estade): this row needs to be deleted.
       continue;
@@ -719,7 +719,7 @@ QuotaErrorOr<std::set<BucketLocator>> QuotaDatabase::GetBucketsForEviction(
     }
 
     // Only the default bucket is persisted by `navigator.storage.persist()`.
-    const bool is_default = statement.ColumnString(2) == kDefaultBucketName;
+    const bool is_default = statement.ColumnStringView(2) == kDefaultBucketName;
     const GURL read_gurl = read_storage_key->origin().GetURL();
     if (is_default && special_storage_policy &&
         (special_storage_policy->IsStorageDurable(read_gurl) ||
@@ -760,7 +760,7 @@ QuotaErrorOr<std::set<StorageKey>> QuotaDatabase::GetStorageKeysForType(
   std::set<StorageKey> storage_keys;
   while (statement.Step()) {
     std::optional<StorageKey> read_storage_key =
-        StorageKey::Deserialize(statement.ColumnString(0));
+        StorageKey::Deserialize(statement.ColumnStringView(0));
     if (!read_storage_key.has_value()) {
       continue;
     }
@@ -796,13 +796,13 @@ QuotaErrorOr<std::set<BucketLocator>> QuotaDatabase::GetBucketsModifiedBetween(
   std::set<BucketLocator> buckets;
   while (statement.Step()) {
     std::optional<StorageKey> read_storage_key =
-        StorageKey::Deserialize(statement.ColumnString(1));
+        StorageKey::Deserialize(statement.ColumnStringView(1));
     if (!read_storage_key.has_value()) {
       continue;
     }
     buckets.emplace(BucketId(statement.ColumnInt64(0)),
                     read_storage_key.value(), type,
-                    statement.ColumnString(2) == kDefaultBucketName);
+                    statement.ColumnStringView(2) == kDefaultBucketName);
   }
   return buckets;
 }
@@ -1305,7 +1305,7 @@ QuotaError QuotaDatabase::DumpBucketTable(const BucketTableCallback& callback) {
 
   while (statement.Step()) {
     std::optional<StorageKey> storage_key =
-        StorageKey::Deserialize(statement.ColumnString(1));
+        StorageKey::Deserialize(statement.ColumnStringView(1));
     if (!storage_key.has_value()) {
       continue;
     }
diff --git a/storage/browser/quota/quota_database_migrations.cc b/storage/browser/quota/quota_database_migrations.cc
index e52f647c96621..81abe40054f8b 100644
--- a/storage/browser/quota/quota_database_migrations.cc
+++ b/storage/browser/quota/quota_database_migrations.cc
@@ -181,7 +181,7 @@ bool QuotaDatabaseMigrations::MigrateFromVersion7ToVersion8(
     insert_statement.BindInt64(0, bucket_id.value());
 
     // Populate storage key and host.
-    std::string storage_key_string = select_statement.ColumnString(1);
+    std::string_view storage_key_string = select_statement.ColumnStringView(1);
     insert_statement.BindString(1, storage_key_string);
 
     std::optional<blink::StorageKey> storage_key =
@@ -194,7 +194,7 @@ bool QuotaDatabaseMigrations::MigrateFromVersion7ToVersion8(
     // Populate type, name, use_count, last_accessed, last_modified,
     // expiration and quota.
     insert_statement.BindInt(3, select_statement.ColumnInt(2));
-    insert_statement.BindString(4, select_statement.ColumnString(3));
+    insert_statement.BindString(4, select_statement.ColumnStringView(3));
     insert_statement.BindInt(5, select_statement.ColumnInt(4));
     insert_statement.BindTime(6, select_statement.ColumnTime(5));
     insert_statement.BindTime(7, select_statement.ColumnTime(6));
@@ -282,11 +282,10 @@ bool QuotaDatabaseMigrations::MigrateFromVersion8ToVersion9(
     last_bucket_id = BucketId(select_statement.ColumnInt64(0));
 
     insert_statement.BindInt64(0, select_statement.ColumnInt64(0));
-    insert_statement.BindString(1, select_statement.ColumnString(1));
-    insert_statement.BindString(2, select_statement.ColumnString(2));
+    insert_statement.BindString(1, select_statement.ColumnStringView(1));
+    insert_statement.BindString(2, select_statement.ColumnStringView(2));
     insert_statement.BindInt(3, select_statement.ColumnInt(3));
-    const std::string bucket_name = select_statement.ColumnString(4);
-    insert_statement.BindString(4, bucket_name);
+    insert_statement.BindString(4, select_statement.ColumnStringView(4));
     insert_statement.BindInt(5, select_statement.ColumnInt(5));
     insert_statement.BindTime(6, select_statement.ColumnTime(6));
     insert_statement.BindTime(7, select_statement.ColumnTime(7));